【问题标题】:Azure API Management JWT validation failsAzure API 管理 JWT 验证失败
【发布时间】:2018-06-26 09:28:45
【问题描述】:

我正在尝试实现 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-tokensrequire-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 请求跟踪没有提供任何有用的信息。

我有什么明显的遗漏吗?

【问题讨论】:

标签: azure jwt azure-api-management


【解决方案1】:

因此,感谢Swikruti Boses 评论中的ULR,我能够查明并消除问题。 事实证明,Azure 门户中的跟踪显示所有可用信息。 具体来说:它缺少 on-error 条目。

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

算法:“HS256”要求 SecurityKey.KeySize 大于“128”位。

提供更长的密钥后,一切都按预期进行。

这就是我懒于测试的结果。

【讨论】:

  • 检测这种情况的另一种方法是仍然与请求一起发送订阅密钥(开放产品不需要密钥,但仍然接受一个),并通过 ocp-apim-trace 标头请求跟踪。那么这个错误就会出现在请求跟踪中。
  • 问题是,它没有出现在那里。在门户中,我可以看到 inboundbackendoutbound 策略的跟踪。此错误在 on-error 策略中可见,但未显示在门户中。另一件事是,如果没有订阅密钥,您甚至不会获得跟踪。
【解决方案2】:

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

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

【讨论】:

  • 我也试过这个,但没有运气。如果您将引用的视频快进到 21:07,您会注意到标题中没有 bearer
【解决方案3】:
  1. 我创建了以下策略。请注意,键值应为 Base64 字符串

<policies>
    <inbound>
        <base />
        <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="No auth" require-expiration-time="false">
            <issuer-signing-keys>
                <key>UGFzc3dvcmRraHNhZXJhdmJhZSdyZWp2dmFlcg==</key>
            </issuer-signing-keys>
        </validate-jwt>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>
  1. 导航到https://jwt.io/ 并创建我的令牌。将您的密钥值(我的是“UGFzc3dvcmRraHNhZXJhdmJhZSdyZWp2dmFlcg==”,它是 Passwordkhsaeravbae'rejvvaer 的编码值)添加到“your-256-bit-secret”,然后单击“secret base64 编码”

我的令牌是:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIyNDc1ODc4MzU3In0.oDLvHDYVMzVYNdwQ1gGE8-n_-tA_8I4DJ-8dWjlluR8
  1. 最终,我们可以从 azure 门户对其进行测试。

【讨论】:

    猜你喜欢
    • 2021-09-10
    • 2021-04-03
    • 1970-01-01
    • 2018-10-13
    • 2017-11-16
    • 2018-10-02
    • 2019-04-29
    • 2017-09-21
    相关资源
    最近更新 更多