当前位置: 首页 > 面试题库 >

如何验证MS Azure AD产生的JWT id_token?

牧献
2023-03-14
问题内容

我有一个使用ADAL-JS(和adal-angular)的angularjs SPA Web应用程序。它是针对MS
Azure中的企业AD进行身份验证而设置的。登录流程似乎正常工作,并且SPA收到id_token。

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

我有一个示例令牌,并且可以在https://jwt.io/上正确解析,但是到目前为止,我找不到我应该用来验证签名的公钥或证书。我看过:

  • https://login.microsoftonline.com/ {tenantid} /federationmetadata/2007-06/federationmetadata.xml
  • https://login.microsoftonline.com/ {tenantId} / discovery / keys
  • 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/discovery/keys
  • https://login.microsoftonline.com/common/discovery/v2.0/keys


我应该在https://login.microsoftonline.com/common/discovery/keys中使用键的x5c属性值,该值与JWT
id_token中的kid和x5t属性相匹配(当前a3QN0BZS7s4nN-BdrjbF0Y_LdMM,这导致x5c值开始与“
MIIDBTCCAe2gAwIBAgIQY …”)。但是,https://jwt.io/页面报告“ Invalid
Signature”(我也尝试用“ ----- BEGIN CERTIFICATE -----”和“ ----- END CERTIFICATE-
----“)。

另外,是否有一个(可能是python)库可以像上面的情况那样方便验证给定的id_token(这样我就不必自己亲自去抓取签名密钥了?)…最好的我可以找到(适用于python的ADAL)似乎没有提供此功能?


问题答案:

到目前为止,我可以提出的最佳解决方案:

抓斗的证书
(中的第一个值x5c从任一属性阵列)https://login.microsoftonline.com/common/discovery/keyshttps://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获取令牌来进行验证。

例如, 在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库的列表,请参见JWT网站。我正在使用pyjwt及其加密依赖(具有二进制依赖,因此需要针对目标OS构建和打包)。

然后,当然,你可以 验证其他细节,如索赔 的建议在这里。



 类似资料:
  • 本文向大家介绍python 产生token及token验证的方法,包括了python 产生token及token验证的方法的使用技巧和注意事项,需要的朋友参考一下 1、前言 最近在做微信公众号开发在进行网页授权时,微信需要用户自己在授权url中带上一个类似token的state的参数,以防止跨站攻击。 在经过再三思考之后,自己试着实现一个产生token和验证token的方案。接下就把code贴出来

  • 为了避免在模式验证过程中出现PHP警告,可以使用和

  • 问题内容: 如何验证文本字段以仅在Swing中的小数点后输入4位数字? 问题答案: 可以使用进行Swing中的任何验证。 1.首先创建自己的输入验证器: 2.然后将该类的实例分配给您的文本字段。(实际上任何都可以验证) 当然,您也可以使用匿名内部类,但是如果将验证器也用于其他组件,则普通类会更好。 还可以查看SDK文档:JComponent#setInputVerifier。

  • 我想使用jQuery验证插件验证输入(出生日期),但它必须是“dd/mm/yyyy”格式,并且在年份日期超过2002年时不进行验证。 因此,该日期在格式为“dd/mm/yyyy”且年份超过“2002”时有效

  • 本文向大家介绍java如何生成登录随机验证码,包括了java如何生成登录随机验证码的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java生成登录随机验证码的具体代码,供大家参考,具体内容如下 验证码工具类: VerifyUtil.java 获取验证码 页面 更多关于验证码的文章请点击查看: 《java验证码》 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊

  • 问题内容: 谁能告诉我如何在内验证? 我需要它来防止用户单击“保存”,除非同时输入了两个字段。 到目前为止,这是我的代码: 这是我用于验证电子邮件字段的功能: 问题答案: 这可以通过扩展: