从Azure HTTPTrigger函数创建事件网格事件时“请求中无授权标头”

ttcibm8c  于 2023-05-29  发布在  其他
关注(0)|答案(2)|浏览(131)

我已经遵循了一些例子(几页都是类似的)如何从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中找到的一点可能有帮助,但我发现大多数示例都是从事件网格中消费事件,所以我希望这里有人有经验可以分享。

hpxqektj

hpxqektj1#

看起来错误是在您尝试调用http函数时发生的,而不是在实际执行将Event发送到Event网格期间发生的。
检查Azure函数上设置的身份验证。在Azure功能上,单击左侧面板上的“设置”下的“身份验证”。如果您在这里看到任何设置,这意味着创建该函数的人希望您在调用http端点时发送一个承载令牌。我建议您联系为客户端凭据进行此设置的人员。如果您可以停用此功能,使其看起来像下面这样,则可以在没有任何授权头的情况下调用该函数。

要验证这一点,您可以尝试创建一个默认的样板http触发函数(排除任何输出绑定)。现在尝试并触发此功能。如果你收到同样的错误,它证实了我的假设。
匿名函数意味着URL中不需要API密钥。这与我上面提到的AD认证无关。

jk9hmnmh

jk9hmnmh2#

我在我的环境中复制了报告的问题,并得到了以下结果-

我创建了一个azure Http触发函数,用于将事件发送到事件网格主题,其中系统标识状态设置为off,该函数是一个匿名HTTP触发函数。

前提条件-

pip install azure-eventgrid
pip install azure-functions

编码-
init.py文件-

import  logging
import  json
import  datetime
import  requests
import  azure.functions  as  func
def  main(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
event_data  = [ {
"id": "127",
"subject": "Event Published successfully",
"data": {
"tag1": "12345",
"tag2": "6789"
},
"eventType": "test-event-1",
"eventTime": datetime.datetime.utcnow().isoformat(),
"dataVersion": "1.0"
}]
logging.info(event_data)
topic_endpoint  =  "< your topic endpoint >"
topic_key  =  "< Event grid topic key >"
headers  = {
"Content-type": "application/json",
"aeg-sas-key": topic_key
}
response  =  requests.post(topic_endpoint, headers=headers, data=json.dumps(event_data))
if  response.status_code  ==  200:
return  func.HttpResponse("Event sent successfully")
else:
return  func.HttpResponse(f"Failed to send event: {response.text}")

function.json文件-

{
"scriptFile": "__init__.py",
"entryPoint": "main",
"bindings": [
{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "$return"
}
]
}

VS编码-

** Postman **-

输出-

Azure Portal-
事件发送前-

事件发送后-

相关问题