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

Spring Cloud Config OAuth2认证下,其他服务调用如何获取Bearer Token?

Spring Cloud Config 结合 OAuth2 令牌访问的实现方案

这个方案完全可行,Spring Cloud和Spring Boot生态原生支持这种通过OAuth2令牌访问受保护配置服务的场景,不需要手动编写令牌获取和调用的冗余逻辑,下面是具体实现步骤:

一、添加必要依赖

在客户端服务的pom.xml(Maven)或build.gradle(Gradle)中引入以下依赖:

  • spring-cloud-starter-config:用于集成Spring Cloud Config客户端
  • spring-boot-starter-oauth2-client:处理OAuth2令牌的自动获取与请求携带

Maven示例:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>
</dependencies>

二、配置客户端服务(bootstrap.yml)

由于Spring Cloud Config的加载处于应用启动的bootstrap阶段,所有相关配置要放在bootstrap.yml中:

spring:
  cloud:
    config:
      import: "configserver:{cloud-cfg-svc-uri}" # 替换为你的Config服务地址
      uri: {cloud-cfg-svc-uri}
  security:
    oauth2:
      client:
        registration:
          config-server: # 自定义的客户端标识,需和后续代码中的ID对应
            client-id: your-client-id # 令牌服务分配的客户端ID
            client-secret: your-client-secret # 令牌服务分配的客户端密钥
            authorization-grant-type: client_credentials # 服务间调用常用客户端凭证模式,可根据实际场景调整
            scope: config:read # Config服务要求的权限范围
        provider:
          config-server:
            token-uri: {token-provider-uri} # 令牌服务的token获取端点(比如/oauth2/token)

三、自动携带令牌到Config服务请求

创建一个配置类,让Spring Cloud Config客户端的RestTemplate自动携带OAuth2令牌:

import org.springframework.cloud.config.client.ConfigServerConfigurer;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.client.OAuth2AuthorizeRequest;
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager;
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProvider;
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProviderBuilder;
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
import org.springframework.security.oauth2.client.web.DefaultOAuth2AuthorizedClientManager;
import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ConfigClientOAuth2Config implements ConfigServerConfigurer {

    private final OAuth2AuthorizedClientManager authorizedClientManager;

    public ConfigClientOAuth2Config(ClientRegistrationRepository clientRegistrationRepo,
                                    OAuth2AuthorizedClientRepository authorizedClientRepo) {
        // 构建客户端凭证模式的令牌提供者
        OAuth2AuthorizedClientProvider provider = OAuth2AuthorizedClientProviderBuilder.builder()
                .clientCredentials()
                .build();
        // 初始化授权客户端管理器
        this.authorizedClientManager = new DefaultOAuth2AuthorizedClientManager(
                clientRegistrationRepo, authorizedClientRepo);
        this.authorizedClientManager.setAuthorizedClientProvider(provider);
    }

    @Override
    public void configure(RestTemplate restTemplate) {
        // 添加请求拦截器,自动注入Bearer令牌
        restTemplate.getInterceptors().add((request, body, execution) -> {
            var authorizedClient = authorizedClientManager.authorize(
                    OAuth2AuthorizeRequest.withClientRegistrationId("config-server").build());
            if (authorizedClient != null) {
                request.getHeaders().setBearerAuth(authorizedClient.getAccessToken().getTokenValue());
            }
            return execution.execute(request, body);
        });
    }
}

四、Config服务端的OAuth2验证配置

确保你的Config服务端配置为OAuth2资源服务器,正确验证客户端传来的令牌:

场景1:JWT令牌

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: {token-issuer-uri} # 令牌颁发者的URI(比如Auth Server的地址)

场景2:不透明令牌(Opaque Token)

spring:
  security:
    oauth2:
      resourceserver:
        opaque-token:
          introspection-uri: {token-introspection-uri} # 令牌校验端点
          client-id: config-server-client-id # 校验令牌用的客户端ID
          client-secret: config-server-client-secret # 校验令牌用的客户端密钥

关键注意事项

  • 所有Config客户端的配置必须放在bootstrap.yml,否则会因为加载顺序问题导致令牌获取逻辑失效
  • 确保客户端的client-id、client-secret拥有访问Config服务的权限,令牌服务返回的scope包含Config服务要求的权限
  • 调试时可以开启Spring Security的DEBUG日志,查看令牌的获取和携带过程:logging.level.org.springframework.security=DEBUG
  • 如果使用的是Spring Cloud 2022.0+版本,spring.config.import是推荐的配置方式,替代传统的spring.cloud.config.uri单独配置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:01:43