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

OAuth2 client_credentials授权配置异常:令牌不含资源ID

问题分析与解决方案

首先,咱们来拆解你遇到的这个OAuth2AccessDeniedException: Invalid token does not contain resource id (oauth2-resource)异常——这本质是资源服务端对Token的受众(aud字段)校验失败导致的。

问题根源

你的客户端配置里指定了resource.id: oauth2-resource,这意味着客户端请求Token时,会要求Token的aud(受众)包含这个资源ID;但你的资源服务端没有配置对应的资源ID,默认情况下Spring Security OAuth2的资源服务会校验Token的aud是否匹配自身的资源ID,不匹配就会拒绝访问。

而当你移除ServerSecurity配置时,相当于资源服务端关闭了所有接口的权限校验(包括Token的资源ID校验),所以客户端能正常调用,但代价是/actuator/health这类需要放开的接口也被默认的安全规则拦截,返回401。

具体修复步骤

1. 给资源服务端添加资源ID配置

修改服务端的application.yml,在security.oauth2.resource下添加id字段,和客户端保持一致:

server:
  port: 8081
security:
  oauth2:
    client:
      clientId: __data__
      clientSecret: __data__
    resource:
      tokenInfoUri: https://dev-410899.oktapreview.com/oauth2/default/v1/introspect
      id: oauth2-resource # 新增这一行,和客户端的resource.id匹配

2. 调整资源服务端的安全配置,兼顾接口权限和actuator开放

保留你的ServerSecurity配置,确保/actuator/**放开,同时让其他接口(比如/endpoint)正确校验Token的资源权限:

@Configuration
public class ServerSecurity extends ResourceServerConfigurerAdapter {
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/actuator/**").permitAll() // 放开actuator接口
                .anyRequest().access("#oauth2.hasScope('web_app') and #oauth2.hasResourceId('oauth2-resource')"); // 校验Token的scope和资源ID
    }

    // 可选:显式指定资源服务ID,强化校验逻辑
    @Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        resources.resourceId("oauth2-resource");
    }
}

验证逻辑

  • 客户端请求Token时,会携带资源ID参数,Okta生成的Token会包含aud: ["oauth2-resource"]
  • 资源服务端收到请求后,会调用tokenInfoUri校验Token,同时检查Token的aud是否匹配自身配置的资源ID,匹配则允许访问
  • /actuator/**接口依然保持开放,不会返回401

这样就能同时解决Token资源ID校验失败和actuator接口401的问题了。

内容的提问来源于stack exchange,提问作者sva605

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:41:41