我有一个 angularjs SPA Web 应用程序,它使用ADAL-JS https://github.com/AzureAD/azure-activedirectory-library-for-js(和 adal 角度)。
它被设置为在 MS Azure 中对我们的公司 AD 进行身份验证。登录流程似乎工作正常,并且 SPA 收到一个 id_token。
接下来,当用户单击按钮时,SPA 会向我在 AWS API Gateway 上托管的 REST API 发出请求。我正在传递 id_tokenAuthorization: Bearer <id_token>
标头。
API 网关按预期接收标头,现在必须确定给定的令牌是否有效,以允许或拒绝访问。
我有一个示例令牌,它可以正确解析https://jwt.io/ https://jwt.io/但到目前为止我还没有找到我应该用来验证签名的公钥或证书。我看过:
-
https://login.microsoftonline.com/ https://login.microsoftonline.com/{tenantid}/federationmetadata/2007-06/federationmetadata.xml
-
https://login.microsoftonline.com/ https://login.microsoftonline.com/{tenantId}/发现/密钥
-
https://login.microsoftonline.com/common/.well-known/openid-configuration https://login.microsoftonline.com/common/.well-known/openid-configuration(获取 jwks_uri)
- https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration
- https://login.microsoftonline.com/common/discovery/keys https://login.microsoftonline.com/common/discovery/keys
- https://login.microsoftonline.com/common/discovery/v2.0/keys https://login.microsoftonline.com/common/discovery/v2.0/keys
I think我应该使用密钥的 x5c 属性的值https://login.microsoftonline.com/common/discovery/keys https://login.microsoftonline.com/common/discovery/keys匹配 JWT id_token 中的 kids 和 x5t 属性(当前a3QN0BZS7s4nN-BdrjbF0Y_LdMM
,这会导致以“MIIDBTCCAe2gAwIBAgIQY...”开头的 x5c 值)。但是,那https://jwt.io/ https://jwt.io/页面报告“无效签名”(我还尝试用“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”包装密钥值)。
另外,是否有一个(可能是python)库可以像上面的情况一样促进给定id_token的验证(这样我就不必自己去即时获取签名密钥?)...我最好的能找到 (适用于 Python 的 ADAL https://github.com/AzureAD/azure-activedirectory-library-for-python)好像没有提供这个功能?
到目前为止我能想到的最佳解决方案:
领取证书(第一个值x5c
属性数组)来自任一https://login.microsoftonline.com/common/discovery/keys
or https://login.microsoftonline.com/common/discovery/v2.0/keys
, 匹配kid
and x5t
来自 id_token。
包裹证书 in -----BEGIN CERTIFICATE-----\n
and \n-----END CERTIFICATE-----
(换行符似乎很重要),并将结果用作公钥(与 id_token 结合使用,https://jwt.io/ https://jwt.io/ ).
当然,您的实际用例可能是让某些程序验证传入的 JWT id_tokens,因此您的目标不是简单地通过 Web UI 获取令牌进行验证https://jwt.io/ https://jwt.io/.
例如,在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 库的列表,请参阅智威汤逊网站 https://jwt.io/#libraries-io。
我在用着pyjwt https://github.com/jpadilla/pyjwt/,及其密码学 https://cryptography.io/en/latest/依赖项(具有二进制依赖项,因此需要为目标操作系统构建和打包)。
然后,当然,你可以核实索赔等其他详细信息 as 推荐这里 https://learn.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-tokens#validating-tokens.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)