Azure API 管理 JWT 验证失败
Azure API Management JWT validation fails
我正在尝试实施 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 header 因为包含 API 的产品不需要订阅,你我'我们也用一个测试过。
结果:
b'{ "statusCode": 401, "message": "No auth" }'
API 请求跟踪没有提供任何有用的信息。
有什么明显的我遗漏的吗?
您需要将“bearer
”添加到 Authorization
header 值,即:
headers = {"Authorization": "bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIxNTM0MDAzOTk4In0.0DlazlR4-InCb-m0dBs-9BbPbyvu5s7Opr8uXIUaMdA"}
因此,感谢 ULR in Swikruti Bose 的评论,我能够查明并消除问题。
事实证明,Azure 门户中的跟踪 并未 显示所有可用信息。
具体来说:它缺少 on-error 条目。
在查看了 Ocp-Apim-Trace-Location 响应 header 中提供的完整跟踪后,我发现了这个小金块:
The algorithm: 'HS256' requires the SecurityKey.KeySize to be greater than '128' bits.
提供更长的密钥后,一切正常。
这就是我懒惰测试的结果。
- 我制定了以下政策。请注意键值应该是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>
- 导航至 https://jwt.io/ 并创建我的令牌。将您的密钥值(我的是“UGFzc3dvcmRraHNhZXJhdmJhZSdyZWp2dmFlcg==”,这是 Passwordkhsaeravbae'rejvvaer 的编码值)添加到“your-256-bit-secret”,然后单击“secret base64 encoded”
我的令牌是:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIyNDc1ODc4MzU3In0.oDLvHDYVMzVYNdwQ1gGE8-n_-tA_8I4DJ-8dWjlluR8
- 最终,我们可以在 Azure 门户上进行测试。
我正在尝试实施 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 header 因为包含 API 的产品不需要订阅,你我'我们也用一个测试过。 结果:
b'{ "statusCode": 401, "message": "No auth" }'
API 请求跟踪没有提供任何有用的信息。
有什么明显的我遗漏的吗?
您需要将“bearer
”添加到 Authorization
header 值,即:
headers = {"Authorization": "bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIxNTM0MDAzOTk4In0.0DlazlR4-InCb-m0dBs-9BbPbyvu5s7Opr8uXIUaMdA"}
因此,感谢 ULR in Swikruti Bose 的评论,我能够查明并消除问题。 事实证明,Azure 门户中的跟踪 并未 显示所有可用信息。 具体来说:它缺少 on-error 条目。
在查看了 Ocp-Apim-Trace-Location 响应 header 中提供的完整跟踪后,我发现了这个小金块:
The algorithm: 'HS256' requires the SecurityKey.KeySize to be greater than '128' bits.
提供更长的密钥后,一切正常。
这就是我懒惰测试的结果。
- 我制定了以下政策。请注意键值应该是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>
- 导航至 https://jwt.io/ 并创建我的令牌。将您的密钥值(我的是“UGFzc3dvcmRraHNhZXJhdmJhZSdyZWp2dmFlcg==”,这是 Passwordkhsaeravbae'rejvvaer 的编码值)添加到“your-256-bit-secret”,然后单击“secret base64 encoded”
我的令牌是:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIyNDc1ODc4MzU3In0.oDLvHDYVMzVYNdwQ1gGE8-n_-tA_8I4DJ-8dWjlluR8
- 最终,我们可以在 Azure 门户上进行测试。