- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 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
,匹配 kid
和 x5t
来自 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/
我正在尝试创建一个 Shiny 的应用程序,该应用程序首先使用 OAuth 进行授权(请参阅 https://developers.google.com/identity/sign-in/web/si
我成功地将我的 Alexa 应用程序(客户端)链接到我们公司的 OpenID Connect 平台(授权服务器)。 我们的授权服务器向 Alexa 客户端返回以下信息: { "access_toke
我已经在java中成功实现了OpenID Connect。仅剩余部分经过验证 id_token。我已经使用 base64 解码了 id_token 并获取了用户电子邮件和姓名。现在我想验证 id_to
我正在实现“使用 PayPal 登录”功能。应该相当简单,但不幸的是 PayPal 缺少文档(只描述了一些基本的东西)。 我使用“使用 PayPal 登录”小部件获取 authorization_co
我想注册一个守护程序应用程序并为其授予 Microsoft graph API 的应用程序权限。现在,我将从我的客户端将 client_id 和 key 传递到端点,然后进行如下调用app.acqui
我想注册一个守护程序应用程序并为其授予 Microsoft graph API 的应用程序权限。现在,我将从我的客户端将 client_id 和 key 传递到端点,然后进行如下调用app.acqui
使用 Google OAuth2 API 时,我收到不一致的回复参数。 范围:['电子邮件','个人资料'] 预期响应: { access_token: 'ya29.fQB...aYSwXTK7E
使用 response_type=code 对支持 OpenID 的 OAuth2 授权服务器进行身份验证后与 scope=openid email ,调用 token 端点应返回 id_token
var login = function () { var deferred = $q.defer(); gapi.auth.authorize({
我正在使用 IdentityServer4,我想将计算字段添加到 access_token/id_token。 此类字段的示例可以是用户的 IP(或 token 绑定(bind)哈希), token
我们正在开发一个 Multi-Tenancy Web 应用程序。我们的租户将使用 Windows Azure Active Directory 进行身份验证。我们正在使用 OWIN OpenIdCon
我关注了以下博客 post实现苹果登录。它是很久以前写的,当时没有带有用户信息的 id_token。当我请求 token API 时,我收到包含多个字段的 JSON。问题是如何解码 id_token
引用 JWT(id_token) decoding docs 后 我很困惑主要服务提供商是否会遵循相同的技术...... 微软oauth2.0客户端在git project getUserEmailF
我在 Azure AD 中注册了一个应用程序。 如果我在 Web API 级别和客户端(SPA 应用程序)级别使用相同的应用程序 ID,为什么两个 Azure AD 身份验证库都这样做 (ADAL J
我正在使用从 Microsoft 到客户端的 jwt token 来验证从它到 Web API(服务器)的请求。我可以控制客户端 (js) 和服务器 (Python) 的代码。 在客户端,我使用以下请
我已成功通过我的 Angular 应用程序中的 Azure AD ( https://login.microsoftonline.com/ {tenantId}/oauth2/v2.0/authori
引用 JWT(id_token) decoding docs 后 我很困惑主要服务提供商是否会遵循相同的技术...... 微软oauth2.0客户端在git project getUserEmailF
我在 Azure AD 中注册了一个应用程序。 如果我在 Web API 级别和客户端(SPA 应用程序)级别使用相同的应用程序 ID,为什么两个 Azure AD 身份验证库都这样做 (ADAL J
我正在使用从 Microsoft 到客户端的 jwt token 来验证从它到 Web API(服务器)的请求。我可以控制客户端 (js) 和服务器 (Python) 的代码。 在客户端,我使用以下请
我目前正在实现 Google OpenID 以在我的网站上实现使用 google 登录。继tutorial given by google 。它强调只有 id_token 是发送到后端服务器的东西。由
我是一名优秀的程序员,十分优秀!