【问题标题】:Unable to successfully validate an access token from Microsoft Graph API无法从 Microsoft Graph API 成功验证访问令牌
【发布时间】:2021-01-04 13:46:26
【问题描述】:

我正在使用 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(受众)和 iss(发行者)。这些值与 id 令牌不同(我可以成功验证)。

我正在使用以下 url 中记录的公钥:

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

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

【问题讨论】:

    标签: azure azure-active-directory microsoft-graph-api access-token


    【解决方案1】:

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

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

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

    在我看来,行为并不直观,因为我喜欢构建基于标准的解决方案。如果它有帮助,这里是 visual blog post of mine 让上面的第二个场景正常工作。

    【讨论】:

    • 加里,你的博客真的帮助打破了它。感谢您对此的回应。
    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复。这两个答案都帮助我理解了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2021-06-13
    • 2017-11-26
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多