Authentication 使用公钥的Microsoft Graph AccessToken签名验证
我需要验证来自Microsoft Graph API的令牌签名。我知道所使用的签名密钥的指纹在JWT的标题中: 它对应于您可以从已知端点获得的密钥: 它返回一组密钥,包括令牌的签名密钥: 我的计划是将密钥列表存储在缓存中,以便在需要进行验证时查找令牌的正确签名密钥。但是,我知道有时关键点可能会旋转 由于没有太多关于这方面的文件,我的问题分为多个部分:Authentication 使用公钥的Microsoft Graph AccessToken签名验证,authentication,oauth,jwt,microsoft-graph-api,openid,Authentication,Oauth,Jwt,Microsoft Graph Api,Openid,我需要验证来自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),但没有什么能阻止他们在将来某个时间点使用更长的链。实际上,他们不太可能这样做,因为这将影响许多不符合要求的应用程序以及他们自己的库