Spring Boot集成Cognito OAuth认证遇401错误,求排查及audience获取方法
Spring Boot集成Amazon Cognito遇401未授权问题:Audience配置指南
问题描述
我开发了一个Spring Boot应用,集成Amazon Cognito用户认证流程时,所有请求均返回401未授权错误,无法定位根源。怀疑是audience配置有误,想知道正确的audience信息应该从何处获取?
依赖配置
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> <version>2.6.3</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> <version>2.6.3</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-resource-server</artifactId> <version>5.6.1</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-jose</artifactId> <version>5.6.1</version> </dependency> </dependencies>
application.yml配置
server: port: 9090 spring: security: oauth2: client: provider: cognito: audience: ** issuerUri: **
当前Audience配置情况
我当前使用Client ID作为audience,对应界面截图如下:
Security Config代码
@EnableWebFluxSecurity public class SecurityConfig { @Value("${spring.security.oauth2.client.provider.cognito.issuerUri}") private String issuer; @Value("${spring.security.oauth2.client.provider.cognito.audience}") private String audience; @Bean SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { http .authorizeExchange() .pathMatchers("/actuator/**").permitAll() .pathMatchers(GET, "/home").permitAll() .anyExchange().authenticated() .and() .cors() .and() .oauth2ResourceServer() .jwt() .jwtDecoder(jwtDecoder()); return http.build(); } ReactiveJwtDecoder jwtDecoder() { NimbusReactiveJwtDecoder jwtDecoder = (NimbusReactiveJwtDecoder) ReactiveJwtDecoders.fromOidcIssuerLocation(issuer); OAuth2TokenValidator<Jwt> audienceValidator = new AudienceValidator(audience); OAuth2TokenValidator<Jwt> withIssuer = JwtValidators.createDefaultWithIssuer(issuer); OAuth2TokenValidator<Jwt> withAudience = new DelegatingOAuth2TokenValidator<>(withIssuer, audienceValidator); jwtDecoder.setJwtValidator(withAudience); jwtDecoder.setClaimSetConverter(new ClaimAdapter()); return jwtDecoder; }}
正确获取Audience的方法
1. 先分清Token类型对应的Audience
- 如果你用的是ID Token:它的
aud字段就是Cognito应用的客户端ID(你当前使用的值),但ID Token主要用于前端身份认证,后端资源服务应该使用Access Token来做权限校验。 - 如果你用的是Access Token:分两种场景:
- 未配置自定义资源服务器:
aud字段就是你的App Client ID; - 配置了自定义资源服务器:
aud字段是你为资源服务器设置的资源标识符(Resource Identifier)。
- 未配置自定义资源服务器:
2. 从Cognito控制台获取正确值
场景一:未配置自定义资源服务器
这种情况下Access Token的aud就是你的App Client ID,你当前的取值是正确的,但需要确认请求中携带的是Access Token而非ID Token。
场景二:配置了自定义资源服务器
- 登录AWS控制台,进入目标Cognito用户池;
- 切换到「App integration」标签页,找到「Resource servers」选项;
- 你创建的资源服务器对应的Identifier就是Access Token的
aud值,将其配置到audience字段即可。
3. 额外排查点
- 确认
issuerUri格式正确:必须是https://cognito-idp.{区域}.amazonaws.com/{用户池ID},例如https://cognito-idp.us-east-1.amazonaws.com/us-east-1_XXXXXXXXX; - 解析Token验证:用JWT解析工具(如jwt.io)解析请求携带的Token,检查
aud、iss字段是否与配置一致,同时确认Token未过期、签名有效; - 修复依赖冲突:你的依赖中重复引入了
spring-boot-starter-security(一个无版本,一个指定2.6.3),建议统一版本,避免依赖冲突; - 调整配置节点:当前
audience配置在oauth2.client.provider.cognito下,对于资源服务器,标准配置位置应为spring.security.oauth2.resourceserver.jwt.audience,调整后的配置示例:
spring: security: oauth2: resourceserver: jwt: issuer-uri: **你的issuerUri** audience: **正确的audience值**
内容的提问来源于stack exchange,提问作者Bertug
相关产品推荐
相关产品推荐

