使用okta-spring-boot-starter 2.1.2时JWT校验返回401错误问题咨询
问题根因
okta-spring-boot-starter 2.1.0及以上版本默认新增了JWT访问令牌的受众(audience)校验逻辑,2.0.0版本该校验默认关闭,你现有配置未适配该新增规则会导致令牌校验不通过,返回401错误。
解决方案
推荐方案:配置正确的audience参数
- 先登录Okta后台,进入你使用的授权服务器详情页,确认
Audience字段值,Okta默认授权服务器的audience默认值为api://default,自定义授权服务器填写你自己设置的对应值即可。 - 在项目的application配置文件中新增audience配置:
application.yml 配置示例
okta: oauth2: audience: api://default # 替换为你实际的audience值 issuer: https://你的Okta域名/oauth2/default # 需和后台显示的issuer完全一致,末尾不要加斜杠
application.properties 配置示例
okta.oauth2.audience=api://default okta.oauth2.issuer=https://你的Okta域名/oauth2/default
可选临时兼容方案(不推荐,存在安全风险)
如果暂时不需要做audience校验,可自定义JwtDecoder关闭该校验,代码如下:
@Configuration public class JwtConfig { @Bean public JwtDecoder jwtDecoder(OAuth2ResourceServerProperties properties) { NimbusJwtDecoder jwtDecoder = NimbusJwtDecoder.withJwkSetUri(properties.getJwt().getJwkSetUri()).build(); // 仅保留issuer校验,关闭audience校验 jwtDecoder.setJwtValidator(JwtValidators.createDefaultWithIssuer(properties.getJwt().getIssuerUri())); return jwtDecoder; } }
额外排查点
如果配置完成后依然报错,可检查以下两项:
- 确认你使用的是Okta授权服务器签发的访问令牌,而非ID令牌,ID令牌仅用于身份认证,不能用于API鉴权
- 如果使用的是Okta账户级授权服务器(非自定义/默认授权服务器),audience需配置为你的Okta客户端ID,同时新增配置
okta.oauth2.groups-claim=groups适配权限声明解析
内容的提问来源于stack exchange,提问作者Iggs
相关产品推荐
相关产品推荐

