JWT 令牌的签名无效 - Azure + Spring Boot

Posted

技术标签:

【中文标题】JWT 令牌的签名无效 - Azure + Spring Boot【英文标题】:Invalid signature of JWT token - Azure + Spring Boot 【发布时间】:2021-07-03 07:41:07 【问题描述】:

我正在使用 Azure AD 对 Spring Boot 应用程序进行用户身份验证。我创建了一个应用程序来获取登录用户的访问令牌(令牌创建者应用程序)。在此应用程序的“/token”API 中,从 @RegisteredOAuth2AuthorizedClient 读取访问令牌并返回与响应相同的令牌。

然后我必须将返回的令牌用作具有相同客户端 ID 和相同配置的另一个应用程序的其余 API 的不记名令牌。

但是当我使用那个访问令牌时,它给了我以下错误:

Bearer error="invalid_token", error_description="尝试解码 Jwt 时出错:签名的 JWT 被拒绝:无效签名", error_uri="https://tools.ietf.org/html/rfc6750#section- 3.1"

我在 jwt.io 中检查了 JWT 令牌,它说签名无效。

我做错了什么?

提前致谢。

【问题讨论】:

能否解析token并提供截图? 添加了截图。 你要调用ms graph api吗? 正如您所说,令牌在 jwt.io 中无法解码,所以您能否添加有关如何生成令牌的详细信息,例如您遵循的代码或示例。 @CarlZhao,是的,我正在使用 MS Graph API。 【参考方案1】:

您的访问令牌用于调用 Microsoft Graph API。

但是,Microsoft Graph 的访问令牌不需要通过您的代码进行验证,因为 Graph API 服务器端会对其进行验证。

换句话说,Graph 的访问令牌永远不会在您的代码中通过验证。

如果访问令牌是调用您自己的 API(而不是调用 Microsoft Graph),则需要将范围指定为 [CLIENT_ID of the API app registration]/.default 而不是 https://graph.microsoft.com/.default。然后可以成功验证访问令牌。

【讨论】:

我正在使用相同的 MS Graph API 来验证访问令牌。当我从 Postman 工具创建访问令牌时,它运行良好。但是,当我从 Java 代码创建访问令牌(使用具有相同客户端 ID 和配置或 MSAL4J 的不同 Spring Boot 应用程序)时,它会给出“无效签名”错误。为了使用邮递员创建令牌,我按照以下步骤操作:digitalonus.com/… @sagarg 你在邮递员中为scope 赋予了什么价值? @sagarg 我不明白您所说的“当我从 Postman 工具创建访问令牌时,它运行良好”是什么意思。是不是你在邮递员中创建了访问令牌,然后将访问令牌放入你的代码中进行验证,它可以成功调用 microsoft Graph 而不会出现Invalid signature 错误? 我正在使用邮递员检查其余的 API 调用。我想使用访问(承载)令牌保护这些其余 API。为了创建该访问令牌,我尝试了多种方法,例如: 1. 创建了一个单独的 Spring Boot 应用程序(令牌创建器) - 它采用用户凭据并创建令牌。它创建了令牌,但是当我使用该令牌从主应用程序访问其余 API 时,它给出了该令牌的无效签名错误。使用:@RegisteredOAuth2AuthorizedClient("azure") OAuth2AuthorizedClient oAuth2AuthorizedClient @sagarg 这不适用于 Microsoft Graph。请参阅aud。正如我所提到的,Microsoft Graph 访问令牌由 Microsoft Graph 端进行验证。你不能让它在你的代码中通过验证。

以上是关于JWT 令牌的签名无效 - Azure + Spring Boot的主要内容,如果未能解决你的问题,请参考以下文章

验证 Azure 广告访问令牌时签名无效,但 id 令牌有效

使用刷新令牌时 Spring Boot JWT 令牌无效签名

PHP JWT 令牌无效签名

为啥我的来自 Amazon Cognito 的 JWT 令牌具有无效签名?

使用 jsonwebtoken 库生成的 JWT 令牌在 jwt.io 中提供了无效签名

Azure AD - 为啥我无法验证 Azure AD 为我的 Web API 颁发的 JWT 令牌?收到“IDX10516:签名验证失败”错误