Spring Boot + Azure Active Directory 签名的 JWT 被拒绝:需要另一个算法,或者找不到匹配的密钥

Posted

技术标签:

【中文标题】Spring Boot + Azure Active Directory 签名的 JWT 被拒绝:需要另一个算法,或者找不到匹配的密钥【英文标题】:Spring Boot + Azure Active Directory Signed JWT rejected: Another algorithm expected, or no matching key(s) found 【发布时间】:2022-01-15 02:09:29 【问题描述】:

我正在尝试使用 Web 服务为我的 Spring Boot 运行 azure Active Directory。问题是当我成功登录时,它会抛出一个错误:

我添加了以下属性(tetant-id、client-id、client-secret、user-group.allowed-group-names)

azure.activedirectory.redirect-uri-template=http://localhost:8080/login/oauth2/code/

我的配置是:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class AADSecurityConfiguration extends WebSecurityConfigurerAdapter 

  @Override
  public void configure(WebSecurity web) 
    web.ignoring().antMatchers("/health");
  

  @Override
  protected void configure(HttpSecurity http) throws Exception 
    http.authorizeRequests()
        .antMatchers("/oauth2/**", "/login/**")
        .permitAll()
        .anyRequest()
        .authenticated()
        .and()
        .oauth2Login();
  

简单的控制器请求是:

 @GetMapping("/list")
  @PreAuthorize("hasRole('Admin') or hasRole('Users')")
  public String getListPage() 
    return "list";
  

依赖的版本是:

<spring.security.version>5.6.0</spring.security.version>
<spring.boot.version>2.5.4</spring.boot.version>
<azure.version>3.10.0</azure.version>

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
        <version>$spring.boot.version</version>
    </dependency>

    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>azure-spring-boot-starter-active-directory</artifactId>
        <version>$azure.version</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-oauth2-jose</artifactId>
        <version>5.6.0</version>
    </dependency>

你能告诉我这个问题,以便我可以解决吗?

更新: 使用 msal4j 解决。

示例是:

https://github.com/Azure-Samples/ms-identity-java-webapp/tree/master/msal-java-webapp-sample

【问题讨论】:

嗨@volkangurbuz,检查令牌使用jwt.io 验证声明:1)确保您选择了正确的签名算法(RS256)2)检查孩子 声明表示用于验证令牌的特定公钥。确保您正在检查用于签署令牌的密钥。3)验证 scp 声明以验证用户已授予调用应用程序调用您的 API 的权限。4)检查与 aud (audience) :标识令牌的预期接收者 也可以参考这个帖子:***.com/questions/56638408/… 您的问题解决了吗? 【参考方案1】:

检查令牌并使用https://jwt.io 验证声明:

1)确保您选择了正确的签名算法(RS256) JWT 的标头包含有关用于签署令牌的密钥和加密方法的信息:

例子:


  "typ": "JWT",
  "alg": "RS256",
  "x5t": "iBjL1Rcqzhiy4fpxIxdZqohM2Yk",
  "kid": "iBjL1Rcqzhiy4fpxIxdZqohM2Yk"

2) 检查 kid 声明表明用于验证令牌的特定公钥。确保您正在检查用于签署令牌的密钥。

3) 验证 scp 声明以验证用户已授予调用应用程序调用您的 API 的权限。

4)aud (audience) 核对:这可识别令牌的预期接收者 - 其受众。如果值不匹配,您的 API 必须验证此值并拒绝令牌。在 v2.0 令牌中,这始终是 API 的客户端 ID,而在 v1.0 令牌中,它可以是客户端 ID 或请求中使用的资源 URI,具体取决于客户端如何请求令牌。

5) roleswids 声称验证用户自己有权调用您的 API。例如,管理员可能有权写入您的 API,但不是普通用户。

有关更多详细信息,请参阅这些文档

    An error occurred while attempting to decode the Jwt: Signed JWT rejected: Another algorithm expected, or no matching key(s) found Microsoft identity platform access tokens - Microsoft identity platform | Microsoft Docs

【讨论】:

您好 ShrutiJoshi-MT,非常感谢您的回复。正如建议的那样,我已经检查了算法,但是我仍然无法取得进一步进展。我没有在我的应用程序中使用任何算法。我只有上面的示例代码。请问您是否可以向我提供相关文档,或者一些代码sn-ps,涵盖我可以提供的区域? 这里有一些文档可以帮助你:1) docs.microsoft.com/en-us/azure/developer/java/spring-framework/… 2) medium.com/xebia-engineering/… 3)docs.microsoft.com/en-us/azure/developer/java/spring-framework/… 。还要检查上面提到的令牌中的声明

以上是关于Spring Boot + Azure Active Directory 签名的 JWT 被拒绝:需要另一个算法,或者找不到匹配的密钥的主要内容,如果未能解决你的问题,请参考以下文章

未在 Azure 中创建 Spring Boot 会话

Spring Boot flash 属性未在 Azure 上发送

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

使用 MongodB 的 Spring Boot 但连接到 Azure Cosmos

Spring Boot - 无法连接 Azure MySQL 数据库

无法将 Spring Boot 应用程序部署到 Azure