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
相关产品推荐
相关产品推荐

