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

如何用Spring OAuth2客户端(Client Credentials模式)仅获取访问令牌?

使用Spring Boot OAuth2 Client的Client Credentials模式获取访问令牌

为什么要手动创建ReactiveOAuth2AuthorizedClientManager

Spring Boot的OAuth2 Client自动配置主要针对Web应用场景(比如常见的授权码模式),像你这种纯后台用client_credentials模式获取令牌的场景,默认不会自动生成ReactiveOAuth2AuthorizedClientManager Bean,所以你手动定义这个Bean的做法是完全正确的。

如何通过AuthorizedClientManager获取访问令牌

既然已经配置好ReactiveOAuth2AuthorizedClientManager,接下来直接用它发起令牌请求即可,核心就是构建OAuth2AuthorizeRequest并调用authorize方法。

第一步:注入ReactiveOAuth2AuthorizedClientManager

先创建一个服务类,将你定义的管理器注入进来:

import org.springframework.security.oauth2.client.ReactiveOAuth2AuthorizedClientManager;
import org.springframework.security.oauth2.client.OAuth2AuthorizeRequest;
import org.springframework.security.oauth2.client.OAuth2AuthorizedClient;
import reactor.core.publisher.Mono;
import org.springframework.stereotype.Service;

@Service
public class TokenService {

    private final ReactiveOAuth2AuthorizedClientManager authorizedClientManager;

    // 构造方法注入管理器
    public TokenService(ReactiveOAuth2AuthorizedClientManager authorizedClientManager) {
        this.authorizedClientManager = authorizedClientManager;
    }
}

第二步:构建请求并获取令牌

在服务类中添加方法,指定你application.yml里配置的客户端注册ID(即auth0),发起令牌请求:

public Mono<String> getAccessToken() {
    // 构造授权请求,指定客户端注册ID
    OAuth2AuthorizeRequest authorizeRequest = OAuth2AuthorizeRequest.withClientRegistrationId("auth0")
            .principal("client-credentials-principal") // client_credentials模式下,此参数填任意非空字符串即可
            .build();

    // 调用管理器获取授权客户端,从中提取access_token
    return authorizedClientManager.authorize(authorizeRequest)
            .map(OAuth2AuthorizedClient::getAccessToken)
            .map(OAuth2AccessToken::getTokenValue);
}

几个关键点

  • principal参数:client_credentials模式不需要用户身份,所以这里随便传一个非空字符串就行,Spring Security只是用它来关联授权上下文。
  • 自动刷新令牌:DefaultReactiveOAuth2AuthorizedClientManager会自动处理令牌过期逻辑,当令牌即将失效时,会自动调用令牌端点刷新,无需手动实现。
  • 异常处理:可以在Mono链上添加onErrorResume来处理请求失败的情况,比如客户端ID/密钥错误、端点不可达等问题。

优化配置(可选但推荐)

建议在application.yml中显式指定授权类型,虽然Spring会根据配置自动推断,但显式声明更清晰:

security:
  oauth2:
    client:
      registration:
        auth0:
          client-id: MgqYHnr4p3wed9qKdzRu9G
          client-secret: some_secret_code
          authorization-grant-type: client_credentials # 显式指定授权模式
      provider:
        auth0:
          issuer-uri: https://dev-5cjo8.eu.auth0.com/

调用示例

如果是在非反应式场景(比如应用启动时执行),可以用block()阻塞获取结果:

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class TokenTestRunner implements CommandLineRunner {

    private final TokenService tokenService;

    public TokenTestRunner(TokenService tokenService) {
        this.tokenService = tokenService;
    }

    @Override
    public void run(String... args) throws Exception {
        String accessToken = tokenService.getAccessToken().block();
        System.out.println("获取到的访问令牌:" + accessToken);
    }
}

内容的提问来源于stack exchange,提问作者Eric B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 18:53:16