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

2024-05-24

我有一个 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(使用前将#替换为@)

如何验证 MS Azure AD 生成的 JWT id_token? 的相关文章

  • 在 Python 中将列表元素作为单独的项目返回

    Stackoverflow 的朋友们大家好 我有一个计算列表的函数 我想单独返回列表的每个元素 如下所示 接收此返回的函数旨在处理未定义数量的参数 def foo my list 1 2 3 4 return 1 2 3 4 列表中的元素数
  • 在 Celery 任务中调用 Google Cloud API 永远不会返回

    我正在尝试拨打外部电话Google Cloud Natural Language API从一个内Celery任务 使用google cloud python包裹 问题是对 API 的调用永远不会返回 挂起 celery task def g
  • matplotlib 图中点的标签

    所以这是一个关于已发布的解决方案的问题 我试图在我拥有的 matplotlib 散点图中的点上放置一些数据标签 我试图在这里模仿解决方案 是否有与 MATLAB 的 datacursormode 等效的 matplotlib https s
  • pandas DataFrame.join 的运行时间是多少(大“O”顺序)?

    这个问题更具概念性 理论性 与非常大的数据集的运行时间有关 所以我很抱歉没有一个最小的例子来展示 我有一堆来自两个不同传感器的数据帧 我需要最终将它们连接成两个very来自两个不同传感器的大数据帧 df snsr1 and df snsr2
  • 我应该使用 Python 双端队列还是列表作为堆栈? [复制]

    这个问题在这里已经有答案了 我想要一个可以用作堆栈的 Python 对象 使用双端队列还是列表更好 元素数量较少还是数量较多有什么区别 您的情况可能会根据您的应用程序和具体用例而有所不同 但在一般情况下 列表非常适合堆栈 append is
  • 使用主题交换运行多个 Celery 任务

    我正在用 Celery 替换一些自制代码 但很难复制当前的行为 我期望的行为如下 创建新用户时 应向tasks与交换user created路由键 该消息应该触发两个 Celery 任务 即send user activate email
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan
  • 为什么 appcmd.exe 解锁配置在 Azure 模拟器上不起作用?

    我最近升级到 Azure 2 1 SDK 现在我的部分功能遇到了问题web config在计算模拟器上运行时处于 Web 角色中 我的web config包含这个
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 使用 Python Oauthlib 通过服务帐户验证 Google API

    我不想使用适用于 Python 的 Google API 客户端库 但仍想使用 Python 访问 Google APIOauthlib https github com idan oauthlib 创建服务帐户后谷歌开发者控制台 http
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序
  • 如何将 ascii 值列表转换为 python 中的字符串?

    我在 Python 程序中有一个列表 其中包含一系列数字 这些数字本身就是 ASCII 值 如何将其转换为可以在屏幕上回显的 常规 字符串 您可能正在寻找 chr gt gt gt L 104 101 108 108 111 44 32 1
  • pandas - 包含时间序列数据的堆积条形图

    我正在尝试使用时间序列数据在 pandas 中创建堆积条形图 DATE TYPE VOL 0 2010 01 01 Heavy 932 612903 1 2010 01 01 Light 370 612903 2 2010 01 01 Me
  • 将 Matlab 的 datenum 格式转换为 Python

    我刚刚开始从 Matlab 迁移到 Python 2 7 在读取 mat 文件时遇到一些问题 时间信息以 Matlab 的日期数字格式存储 对于那些不熟悉它的人 日期序列号将日历日期表示为自固定基准日期以来已经过去的天数 在 MATLAB
  • Python GTK+ 画布

    我目前正在通过 PyGobject 学习 GTK 需要画布之类的东西 我已经搜索了文档 发现两个小部件似乎可以完成这项工作 GtkDrawingArea 和 GtkLayout 我需要一些基本函数 如 fillrect 或 drawline
  • 等待子进程使用 os.system

    我用了很多os system在 for 循环内调用创建后台进程 如何等待所有后台进程结束 os wait告诉我没有子进程 ps 我使用的是Solaris 这是我的代码 usr bin python import subprocess imp
  • 如何使用 PrimaryKeyRelatedField 更新多对多关系上的类别

    Django Rest 框架有一个主键相关字段 http www django rest framework org api guide relations primarykeyrelatedfield其中列出了我的 IDmany to m
  • 如何在 Flask 中的视图函数/会话之间传递复杂对象

    我正在编写一个 Web 应用程序 当 且仅当 用户登录时 该应用程序从第三方服务器接收大量数据 这些数据被解析为自定义对象并存储在list 现在 用户在应用程序中使用这些数据 调用不同的视图 例如发送不同的请求 我不确定什么是最好的模式在视
  • 如何在本地运行 Microsoft Azure DocumentDB?

    我使用 Mac 主要从事 Node js 项目 我想尝试 DocumentDB 将其与 MongoDB 进行比较 有没有办法运行 Azure DocumentDB 的本地实例 而无需经历设置真实帐户的麻烦 Thanks 自2016年11月1
  • 如何将Python3设置为Mac上的默认Python版本?

    有没有办法将 Python 3 8 3 设置为 macOS Catalina 版本 10 15 2 上的默认 Python 版本 我已经完成的步骤 看看它安装在哪里 ls l usr local bin python 我得到的输出是这样的

随机推荐

  • 使用嵌入qt的mysql?

    我正在尝试使用嵌入 QT 的 mysql 我已经有一个与 mysqld 链接的 Qt mysql 插件 该插件可以很好地加载嵌入式数据库 但 QT 没有简单的方法来设置 dataDir 等嵌入式选项 我在这里看到 http doc qt i
  • 无法在 yeoman Angular 生成的 Web 应用程序中生成“dist”文件夹

    我无法生成dist使用 yeoman 角度生成器构建和生成的 Web 应用程序中的文件夹 我正在粘贴 grunt 构建的详细内容 请检查这是否有帮助 pdc1 f3t18r1 ShippingSolution administrator g
  • 简单信号 - C 编程和报警功能

    include
  • 无法调用 XInitThreads

    我编写了一个 SFML C 游戏 并尝试开始使用线程 但过了一会儿一切都崩溃了 经过搜索 我发现修复似乎是调用 XInitThreads 但这在某种程度上不起作用 简化代码 include
  • 如何在 Xamarin Forms 中做出长按手势?

    您能否告诉我如何识别 Xamarin Forms 应用程序中的长按手势 前几天我用过TapGestureRecognizer TapGestureRecognizer imageTap new TapGestureRecognizer im
  • 如何检查该字段是否存在? SAP 图形用户界面脚本

    如何检查该字段是否存在 我尝试过这个 If session findById wnd 1 setFocus Then 你可以尝试例如下列 on error resume next session findById wnd 1 setfocu
  • Git hook:如果创建了新分支,则将新文件添加到存储库

    我正在编写一个 git hook 它检查是否创建了新分支 如果是 则将一些预定义文件添加到该新分支的存储库中 一些配置文件 然而 由于分支实际上正在创建过程中 所以我的逻辑失败了 目前我正在这样做post receive钩子 看起来像这样
  • 跨平台套接字

    我知道 Windows 不使用 UNIX 套接字 而 Mac OS 使用 到目前为止 我的软件是跨平台的 没有任何代码更改 但现在我想让它进行一些网络通信 我了解 POSIX 套接字 但我对 Windows 的套接字一无所知 目标是实现一个
  • 对翻译进行语义标记

    我正在标记一份历史手稿 该手稿已从德文翻译成英文 在网页上 我将并排提供两种语言 是否有一种可接受的方法来标记这种情况 我正在考虑使用部分标签分割翻译块并为每个翻译块提供一个 lang 属性 然而 从语义上讲 这无法传达一个部分与另一部分大
  • 连接数据库错误类型:2002:权限被拒绝

    我正在尝试使用以下脚本连接数据库 cxn test php
  • TranslateAnimation 在 Android 上如何工作?

    我经历了 TranslateAnimation float fromXDelta float toXDelta float fromYDelta float toYDelta 但我仍然很困惑如何Translate animation wor
  • Golang 结构体初始化

    有一个像这样的简单结构 type Event struct Id int Name string 这两种初始化方法有什么区别呢 e1 Event Id 1 Name event 1 e2 Event Id 2 Name event 2 为什
  • 同时使用 localStorage 和 REST 远程服务器的数据层架构

    任何人对于如何实现同时使用 localStorage 和 REST 远程存储的数据持久层都有任何想法或参考 某个客户端的数据存储在 localStorage 中 使用 ember data indexedDB 适配器 本地存储的数据与远程服
  • 如何应用 .diff 文件

    我有一个 diff 类型文件 看起来像爆炸了 diff git a res User lua b res User lua index db8c2cc 4d2af0f 100644 a res User lua b res User lua
  • mysqli_num_rows 无法正常工作

    I have an admin panel in my website in which the admin creates new pages he provides the page name and then the spaces o
  • 在上下文切换期间,操作系统是否使用 PCB 或内核堆栈来恢复寄存器?

    我目前正在阅读 Remzi 和 Andrea 所著的 操作系统 三个简单的部分 在有关上下文切换的部分中 它指出在中断期间 正在运行的进程的寄存器被保存到其内核堆栈中 然后将运行进程的寄存器保存到内核堆栈中 下一个进程是从 PCB 加载的
  • 使用Python查明时区当前是否处于夏令时[重复]

    这个问题在这里已经有答案了 我们有一个在 GMT 时间运行的服务器 我需要编写一个 Python 脚本来确定当前 此时此刻 加利福尼亚州洛杉矶是否为夏令时 DST 我怎样才能做到这一点 我查看了 pytz 和 time 但我无法弄清楚 我意
  • 以受限用户身份运行 monit 并使其监视需要 root 权限的进程

    我有一个用 Ruby 编写的特定脚本 需要 root 权限 大多数其他进程不需要它 因此很容易在 Monit 中设置 不是这个 服务器需要监听386 这个端口只有root可用 我不会详细说明原因 因为 1 我不是一个低级的人 2 到目前为止
  • 通过 exec() 的 Crontab 不适用于 PHP 7.4 / Deb 10

    调试有点困难 因为我正在使用新版本的 PHP 和新服务器上的新操作系统 我有一个 PHP 的 cron 管理系统 它也允许我添加 删除或启用 禁用 cronjobs 在另一台当前使用 PHP 7 2 的 Deb 8 服务器上 它可以使用以下
  • 如何验证 MS Azure AD 生成的 JWT id_token?

    我有一个 angularjs SPA Web 应用程序 它使用ADAL JS https github com AzureAD azure activedirectory library for js 和 adal 角度 它被设置为在 MS