配置客户端凭证OAuth2的OpenAPI RestTemplate客户端如何获取AccessToken
结论
默认的OpenAPI Generator RestTemplate代码生成器不会自动实现OAuth2客户端凭证模式的令牌获取、刷新逻辑,仅会预留你看到的setAccessToken令牌设置入口,因此你确实需要自行补充令牌获取相关逻辑。
你预期的「最终应用仅配置端点、Client ID、Client Secret即可使用」的效果可以通过Spring官方OAuth2客户端组件快速实现,不需要从零编写令牌请求、过期校验、刷新逻辑。
实现步骤
- 引入Spring Security OAuth2客户端依赖
如果是Spring Boot项目,直接引入对应starter即可:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-client</artifactId> </dependency>
- 配置OAuth2客户端参数
在应用的application.yml/application.properties中添加以下配置,无需修改生成的客户端代码:
spring: security: oauth2: client: registration: custom-oauth-client: client-id: 替换为实际Client ID client-secret: 替换为实际Client Secret authorization-grant-type: client_credentials scope: read,write provider: custom-oauth-client: token-uri: https://someurl.somewhere/token
- 绑定令牌逻辑到生成的客户端
通过配置类自动完成令牌获取、注入逻辑,Spring的OAuth2客户端组件已经内置令牌缓存、过期自动刷新能力:
@Configuration public class OpenApiClientAutoConfig { @Bean public 你生成的客户端类名 openApiClient(OAuth2AuthorizedClientManager authorizedClientManager) { 你生成的客户端类名 client = new 你生成的客户端类名(); // 若生成的客户端支持请求拦截器,直接通过拦截器自动注入令牌 client.setRequestInterceptor(request -> { OAuth2AuthorizeRequest req = OAuth2AuthorizeRequest .withClientRegistrationId("custom-oauth-client") .principal("client-credentials-principal") .build(); OAuth2AuthorizedClient authorizedClient = authorizedClientManager.authorize(req); request.getHeaders().setBearerAuth(authorizedClient.getAccessToken().getTokenValue()); }); // 若不支持拦截器,可在业务调用前主动调用以下代码获取令牌后传入setAccessToken方法 // String token = authorizedClientManager.authorize(req).getAccessToken().getTokenValue(); // client.setAccessToken(token); return client; } }
可选优化
如果需要彻底省略手动写配置类的步骤,可自定义OpenAPI Generator的代码生成模板,把上述逻辑直接生成到客户端代码中,不过该方案需要适配插件版本,维护成本更高,一般中小项目直接使用上述配置类方案即可。
内容的提问来源于stack exchange,提问作者wolle271
相关产品推荐
相关产品推荐

