You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,对应界面截图如下:
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。

场景二:配置了自定义资源服务器

  1. 登录AWS控制台,进入目标Cognito用户池;
  2. 切换到「App integration」标签页,找到「Resource servers」选项;
  3. 你创建的资源服务器对应的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 18:24:55