我已经遵循了一些例子(几页都是类似的)如何从Python中的Azure函数发送事件到事件网格主题,但我得到了以下错误:
请求中没有授权头。报告'59 dda 51 f-8df 1 - 40 ed-ac 10-fc 50 cc 9 ec 807:0:5/29/2023 1:04:46 AM(UTC)'到我们的论坛以获得帮助或提出支持票证。状态:401(请求中没有授权标头。举报“59 dda 51 f-8df 1 - 40 ed-ac 10-fc 50 cc 9 ec 807:0:5/29/2023 1:04:46 AM(UTC)”到我们的论坛以获取帮助或提出支持票证。)未经授权的内容:{“error”:{“code”:“未授权”,“消息”:“请求中没有授权标头。向我们的论坛报告“59 dda 51 f-8df 1 - 40 ed-ac 10-fc 50 cc 9 ec 807:0:5/29/2023 1:04:46 AM(UTC)”以获得帮助或提出支持票证。",“details”:[{“code”:“未授权”,“message”:“请求中没有授权标头。向我们的论坛报告“59 dda 51 f-8df 1 - 40 ed-ac 10-fc 50 cc 9 ec 807:0:5/29/2023 1:04:46 AM(UTC)”以获得帮助或提出支持票证。”}] } }标题:服务器:Microsoft-HTTPAPI/2.0 Strict-Transport-Security:已编辑的x-ms-request-id:59 dda 51 f-8df 1 - 40 ed-ac 10-fc 50 cc 9 ec 807日期:周一,2023年5月29日01:04:46 GMT连接:close Content-Length:517内容类型:application/json;字符集=utf-8
我相信我已经将事件网格和函数配置为匿名:
1.事件网格主题:身份关闭,“本地身份验证”被禁用2:Azure函数是一个匿名HTTP触发器(见下文)3:ENDPOINT和ACCESS KEY正确且经过测试/验证
HTTP触发器看起来像这样(init.py):
import logging
import datetime
import os
import azure.functions as azfunc
def main( req: azfunc.HttpRequest
, outputEvent: azfunc.Out[azfunc.EventGridOutputEvent]
) -> azfunc.HttpResponse:
logging.info(f"\nENDPOINT: {os.environ.get('EVENT_GRID_TOPIC_ENDPOINT')}")
logging.info(f"\nKEY: {os.environ.get('EVENT_GRID_TOPIC_KEY')}")
event = azfunc.EventGridOutputEvent (
id="1234",
data={"tag1": "value1", "tag2": "value2"},
subject="test-subject",
event_type="test-event-1",
event_time=datetime.datetime.utcnow(),
data_version="1.0"
)
outputEvent.set(event)
return azfunc.HttpResponse( body=f'Event Sent... {datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")}', status_code=200 )
functions.json看起来像这样:
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"get",
"post"
],
"route": "{*routes}"
},
{
"type": "http",
"direction": "out",
"name": "$return"
},
{
"type": "eventGrid",
"name": "outputEvent",
"topicEndpointUri": "EVENT_GRID_TOPIC_ENDPOINT",
"topicKeySetting": "EVENT_GRID_TOPIC_KEY",
"direction": "out"
}
]
}
到目前为止,除了搜索示例之外,我已经尝试了几种不同的发送事件的方法,包括使用“EventGridPublisherClient”方法(该方法仅在本地计算机上工作,而不是Azure函数)。此外,我尝试启用托管身份,但我需要更多的研究,它感觉像我应该能够运行上述没有身份验证。
我在C#或PowerShell中找到的一点可能有帮助,但我发现大多数示例都是从事件网格中消费事件,所以我希望这里有人有经验可以分享。
2条答案
按热度按时间hpxqektj1#
看起来错误是在您尝试调用http函数时发生的,而不是在实际执行将Event发送到Event网格期间发生的。
检查Azure函数上设置的身份验证。在Azure功能上,单击左侧面板上的“设置”下的“身份验证”。如果您在这里看到任何设置,这意味着创建该函数的人希望您在调用http端点时发送一个承载令牌。我建议您联系为客户端凭据进行此设置的人员。如果您可以停用此功能,使其看起来像下面这样,则可以在没有任何授权头的情况下调用该函数。
要验证这一点,您可以尝试创建一个默认的样板http触发函数(排除任何输出绑定)。现在尝试并触发此功能。如果你收到同样的错误,它证实了我的假设。
匿名函数意味着URL中不需要API密钥。这与我上面提到的AD认证无关。
jk9hmnmh2#
我在我的环境中复制了报告的问题,并得到了以下结果-
我创建了一个azure Http触发函数,用于将事件发送到事件网格主题,其中系统标识状态设置为off,该函数是一个匿名HTTP触发函数。
前提条件-
编码-
init.py文件-
function.json文件-
VS编码-
** Postman **-
输出-
Azure Portal-
事件发送前-
事件发送后-