首页 文章

Azure API管理JWT验证失败

提问于
浏览
0

我正在尝试实现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上我正在生成一个令牌:
enter image description here

然后是时候从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 回答

  • 1

    您需要在 Authorization 标头值中添加“ bearer ”,即:

    headers = {"Authorization": "bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIxNTM0MDAzOTk4In0.0DlazlR4-InCb-m0dBs-9BbPbyvu5s7Opr8uXIUaMdA"}

  • 0

    所以,多亏了ULR的评论,我能够找到并消除这个问题 . 原来,Azure门户 does not 中的跟踪显示所有可用信息 . 具体来说:它缺少错误输入 .

    查看完整跟踪后,在Ocp-Apim-Trace-Location响应头中提供了哪个位置,我发现了这个小块:

    算法:'HS256'要求SecurityKey.KeySize大于'128'位 .

    提供更长的密钥后,一切都按预期工作 .

    这就是我在测试时懒惰所得到的 .

相关问题