我被要求重构一个调用Azure Logic应用程序的AWS Lambda(使用Python(。
当我运行Lambda时,它会得到202(已接受(的响应。在Azure中,我可以看到请求失败,并出现以下错误:
{
"error": {
"code": "AuthenticationFailed",
"message": "Authentication failed. The 'Authorization' header is missing."
}
}
正如错误所说,缺少一个授权标头。奇怪的是,直到最近还在工作的前一个代码库似乎也没有提供任何授权头。
这是我的代码:
import requests
import json
url = "https://prod-01.northcentralus.logic.azure.com:443/workflows/sensitive/triggers/manual/paths/invoke?api-version=2016-10-01&sp=%2Frun%2Fbook%2Fsp&sv=1.0&sig=sensitive"
body = {
"company": "X",
"owner": "bob@email.com"
}
requests.post(url, data=json.dumps(body), headers=headers)
旧lambda的代码本质上是相同的。当我将相关部分复制+粘贴到lambda中时,我会得到同样的错误。
正如我所说,直到最近,这种方法还被认为运行良好。
我在网上的所有阅读都表明,我需要一个使用服务主体生成的承载令牌。
我一直在想如何使用Postman一点一点地把这个请求拼凑在一起。但我在网上找到的解释如何做到这一点的帖子在我尝试时并不奏效。(当我尝试这篇文章时,它说我应该在Postman中得到Invalid Auth Key
的回复。但我只得到了同样的202回复。
我注意到逻辑应用程序url中编码的一个参数是sp=%2Frun%2Fbook%2Fsp
或sp=run/book/sp。这在某种程度上与服务主体有关吗?我没有访问Azure Active Directory的权限来查看它。
非常感谢!
授权头应该是从Azure Active Directory直接从Azure门户获得的JSON Web令牌。
您可以通过在HTTP请求中添加授权标头来解决您所面临的问题。作为其值,提供"Bearer",后跟一个空格,然后是令牌。之后发送请求,它应该可以正常工作。
授权标题应该是这样的:
Authorization : Bearer TOKEN
。
选中此Microsoft文档的"用代码兑换访问令牌"部分,了解如何从Azure Active Directory获取JWT。
有关更多信息,您还应该对照Azure Service Management API文档检查此身份验证邮差。