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) roles 和 wids 声称验证用户自己有权调用您的 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 被拒绝:需要另一个算法,或者找不到匹配的密钥的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot flash 属性未在 Azure 上发送
JWT 令牌的签名无效 - Azure + Spring Boot
使用 MongodB 的 Spring Boot 但连接到 Azure Cosmos