无法成功验证来自Microsoft Graph API的访问令牌



我正在使用Microsoft Graph API和Microsoft身份验证库(MSAL(来获取访问令牌,我可以成功检索访问令牌、id令牌和刷新令牌。我还可以成功验证id令牌。但是,我不能对访问令牌执行同样的操作,因为我收到了以下错误:

raise InvalidSignatureError('Signature verification failed')
jwt.exceptions.InvalidSignatureError: Signature verification failed

我已经尽我所能在这里查看了有关验证的微软文档:Microsoft身份平台访问令牌

为了验证,我可以使用jwt.ms网站成功解码jwt验证。所以我知道代币很好。我可以从解码声明中看到,并提取aud(受众(和iss。对于id令牌(我可以成功验证(,这些值不相同。

我正在使用来自以下url的公钥,如文档所示:

https://login.microsoftonline.com/<TENANT ID>/discovery/keys

那么,在验证访问令牌方面,我缺少什么呢?(如果我可以在没有问题的情况下验证id令牌(。我还能如何解决此问题?

Jim的答案是正确的,实际上有两个用例——所以这取决于你要做什么:

  • 获取Microsoft资源的访问令牌,如Graph,在这种情况下,您不会验证它们的

  • 为您自己的API资源获取令牌,在这种情况下,您需要验证它们。为此,您需要"公开API范围"以获得不同类型的访问令牌

在我看来,行为并不直观,因为我喜欢构建基于标准的解决方案。如果有帮助的话,下面是我的一篇关于让上面的第二个场景发挥作用的可视化博客文章。

据我所知,我们不需要验证Microsoft图形签名。因为MsGraph认识到了提高用户安全性的机会。他们通过在jwt头中放入一个"nonce"来实现这一点。JWS使用nonce的SHA2进行签名,nonce在JWS序列化之前被替换。要验证此令牌,需要将nonce替换为标头中nonce的SHA2。现在,由于没有公共合同,这种情况可能会改变。因此,在调用MicrosoftGraph时,应该将访问令牌视为不透明的。有关更多详细信息,请参阅此处和此处的

最新更新