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

Unable to successfully validate an access token from Microsoft Graph API

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

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

我已尽我所能在此处查看了有关验证的 Microsoft 文档: Microsoft identity platform access tokens

为了验证,我可以使用 jwt.ms 站点成功解码以进行 jwt 验证。所以我知道代币很好。我可以从解码声明中看到并提取 aud(audience) 和 iss(issuer)。这些值与 id 令牌(我可以成功验证)不同。

我正在使用来自以下 url 的 public 密钥,如记录的那样:

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

那么,我在验证访问令牌方面缺少什么? (如果我可以毫无问题地验证 id 令牌)。我还能如何解决这个问题?

据我所知,我们不需要验证 Microsoft 图形签名。因为 MsGraph 认识到了提高用户安全性的机会。他们通过将“nonce”放入 jwt header 来实现这一点。 JWS 使用 nonce 的 SHA2 签名,nonce 在 JWS 序列化之前被替换。要验证此令牌,需要将 nonce 替换为 header 中 nonce 的 SHA2。现在这可以改变,因为没有 public 合同。因此,在调用 Microsoft Graph 时,您应该将访问令牌视为不透明的。详情请参考here and here

Jim 的回答是正确的,实际上有 2 个用例 - 所以这取决于您要做什么:

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

  • 为您自己的 API 资源获取令牌,在这种情况下您需要验证它们。为此,您需要 'expose an API scope' 获取不同类型的访问令牌

在我看来,行为并不直观,因为我喜欢构建基于标准的解决方案。如果有帮助,这里是 visual blog post of mine 使上面的第二种情况起作用。