我正在尝试实现JWT验证,如this video中所示 .
为实现这一目标,我实施了以下政策:
<policies>
<inbound>
<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="No auth" require-expiration-time="false" require-signed-tokens="false">
<issuer-signing-keys>
<key> base64key </key>
</issuer-signing-keys>
</validate-jwt>
<return-response>
<set-status code="200" reason="OK" />
<set-body>test</set-body>
</return-response>
<base />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
在 生产环境 中将启用require-signed-tokens和require-expiration-time - 我试图禁用尽可能多的验证,因为我可以让它运行 .
然后在JWT.io上我正在生成一个令牌:
然后是时候从API获取一些数据了:
import urllib.request
headers = {"Authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIxNTM0MDAzOTk4In0.0DlazlR4-InCb-m0dBs-9BbPbyvu5s7Opr8uXIUaMdA"}
api_request = urllib.request.Request("https://someapi", headers=headers)
try:
api_response = urllib.request.urlopen(api_request)
print(api_response.read())
except urllib.error.HTTPError as e:
print(e.read())
请注意,没有Ocp-Apim-Subscription-Key标头,因为包含API的产品还没有使用它进行测试 . 结果如下:
b'{ "statusCode": 401, "message": "No auth" }'
API请求跟踪不提供任何有用的信息 .
有什么明显的东西我不见了吗?
2 回答
您需要在
Authorization
标头值中添加“bearer
”,即:headers = {"Authorization": "bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIxNTM0MDAzOTk4In0.0DlazlR4-InCb-m0dBs-9BbPbyvu5s7Opr8uXIUaMdA"}
所以,多亏了ULR的评论,我能够找到并消除这个问题 . 原来,Azure门户 does not 中的跟踪显示所有可用信息 . 具体来说:它缺少错误输入 .
查看完整跟踪后,在Ocp-Apim-Trace-Location响应头中提供了哪个位置,我发现了这个小块:
提供更长的密钥后,一切都按预期工作 .
这就是我在测试时懒惰所得到的 .