gpt4 book ai didi

python - 如何验证 MS Azure AD 生成的 JWT id_token?

转载 作者:太空狗 更新时间:2023-10-29 17:58:29 27 4
gpt4 key购买 nike

我有一个 angularjs SPA Web 应用程序,它使用 ADAL-JS (和 adal 角度)。它被设置为在 MS Azure 中对我们的公司 AD 进行身份验证。登录流程似乎工作正常,并且 SPA 收到了 id_token。

接下来,当用户单击按钮时,SPA 会向我在 AWS API Gateway 上托管的 REST API 发出请求。我正在 Authorization: Bearer <id_token> 上传递 id_token header 。API 网关按预期接收 header ,现在必须确定给定的 token 是否有效,以允许或拒绝访问。

我有一个示例 token ,它在 https://jwt.io/ 上正确解析但到目前为止我还没有找到我应该用来验证签名的公钥或证书。我查看过:

认为我应该使用 https://login.microsoftonline.com/common/discovery/keys 中键的 x5c 属性的值匹配 JWT id_token 中的 kids 和 x5t 属性(当前为 a3QN0BZS7s4nN-BdrjbF0Y_LdMM ,这会导致以 "MIIDBTCCAe2gAwIBAgIQY..."开头的 x5c 值)。然而,https://jwt.io/页面报告“无效签名”(我还尝试用“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”包装 key 值)。

另外,是否有一个(可能是Python)库可以像上面的情况一样促进对给定id_token的验证(这样我就不必自己去即时获取签名 key ?)...我能找到的最好的( ADAL for python )似乎没有提供此功能?

最佳答案

到目前为止我能想到的最佳解决方案:

https://login.microsoftonline.com/common/discovery/keys 获取证书(x5c 属性数组中的第一个值) https://login.microsoftonline.com/common/discovery/v2.0/keys,匹配 kidx5t来自 id_token。

将证书包装在 -----BEGIN CERTIFICATE-----\n\n-----END CERTIFICATE-- 中--- (换行符似乎很重要),并将结果用作公钥(与 https://jwt.io/ 上的 id_token 结合使用)。

当然,您的实际用例可能是让某些程序验证传入的 JWT id_tokens,因此您的目标不是简单地通过 https://jwt.io/ 上的 Web UI 获取 token 进行验证。 .

例如,在 python 中,我需要这样的东西:

#!/usr/bin/env python

import jwt
from cryptography.x509 import load_pem_x509_certificate
from cryptography.hazmat.backends import default_backend

PEMSTART = "-----BEGIN CERTIFICATE-----\n"
PEMEND = "\n-----END CERTIFICATE-----\n"

mspubkey = "The value from the x5c property"
IDTOKEN = "the id_token to be validated"
tenant_id = "your tenant id"

cert_str = PEMSTART + mspubkey + PEMEND
cert_obj = load_pem_x509_certificate(cert_str, default_backend())
public_key = cert_obj.public_key()

decoded = jwt.decode(IDTOKEN, public_key, algorithms=['RS256'], audience=tenant_id)
if decoded:
print "Decoded!"
else:
print "Could not decode token."

有关各种语言的 JWT 库的列表,请参阅 the JWT Site 。我正在使用pyjwt ,及其 cryptography依赖项(具有二进制依赖项,因此需要为目标操作系统构建和打包)。

然后,当然,您可以验证其他详细信息,例如声明,如 recommended here .

关于python - 如何验证 MS Azure AD 生成的 JWT id_token?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43142716/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com