Authentication 使用公钥的Microsoft Graph AccessToken签名验证

Authentication 使用公钥的Microsoft Graph AccessToken签名验证,authentication,oauth,jwt,microsoft-graph-api,openid,Authentication,Oauth,Jwt,Microsoft Graph Api,Openid,我需要验证来自Microsoft Graph API的令牌签名。我知道所使用的签名密钥的指纹在JWT的标题中: 它对应于您可以从已知端点获得的密钥: 它返回一组密钥,包括令牌的签名密钥: 我的计划是将密钥列表存储在缓存中,以便在需要进行验证时查找令牌的正确签名密钥。但是,我知道有时关键点可能会旋转 由于没有太多关于这方面的文件,我的问题分为多个部分: 这是一个合理的策略吗 新密钥是否附加到已知端点处的列表中?我假设这个列表会随着时间的推移而增长,所以如果令牌调用它,我总是可以得到一个较旧

我需要验证来自Microsoft Graph API的令牌签名。我知道所使用的签名密钥的指纹在JWT的标题中:

它对应于您可以从已知端点获得的密钥:

它返回一组密钥,包括令牌的签名密钥:

我的计划是将密钥列表存储在缓存中,以便在需要进行验证时查找令牌的正确签名密钥。但是,我知道有时关键点可能会旋转

由于没有太多关于这方面的文件,我的问题分为多个部分:

  • 这是一个合理的策略吗

  • 新密钥是否附加到已知端点处的列表中?我假设这个列表会随着时间的推移而增长,所以如果令牌调用它,我总是可以得到一个较旧的密钥?以及刷新我的缓存,如果它曾经需要用可用的密钥重新水化

  • 旧的键在什么时候从列表中删除?我想一定有一个时间或计数截止

  • 似乎最新的键是第一条记录,并按降序排序

  • 为什么x5c是一个数组?每个记录不应该只有一个签名密钥吗?我想我应该只使用.x5c[0],但在什么情况下这里会有多个项目

已在多个图书馆为您实施;一个好的策略是使用其中之一,而不是自己滚动

来自
JSON文档https://login.microsoftonline.com/[TENANT-ID]/discovery/v2.0/keys
符合JSON Web密钥(JWK)规范()。规范没有规定
数组中键的顺序:

“keys”
参数的值是JWK值的数组。通过 默认情况下,数组中JWK值的顺序并不意味着 它们之间的优先顺序,尽管JWK集的应用 如果需要,可以选择为订单指定意义 想要的

Microsoft的密钥滚动实现似乎将较新的密钥添加到列表的顶部。对此没有书面保证,我们不建议依赖它。 当关键点从列表中删除时,同样没有发布此规范。如果证书被吊销或过期,则无法使用该证书验证签名。根据常识,应该在那个时候将其从列表中删除。微软指出

在紧急情况下,[钥匙]可以立即翻转过来

翻译:决定您应该多长时间返回
https://login.microsoftonline.com/[TENANT-ID]/discovery/v2.0/keys
取决于无法验证应用程序中令牌的重要性/后果

x5c
是一个数组,因为它代表一个数组。微软的实现是使用单个证书(链的长度=1),但没有什么能阻止他们在将来某个时间点使用更长的链。实际上,他们不太可能这样做,因为这将影响许多不符合要求的应用程序以及他们自己的库