Spring Security OAuth2配置:实现OpenID Connect自动获取Token
Spring Security OAuth2 自动完成授权码换取Access Token的配置方案
问题根源
你手动实现授权码回调端点并自行发起token交换请求的操作完全没必要——Spring Security OAuth2 Login模块本身就内置了自动处理授权码换取Access Token的逻辑。问题出在你自定义了redirect-uri但未让Spring识别该路径为OAuth2回调端点,导致默认自动流程被跳过。
正确配置步骤
1. 调整回调地址配置
Spring OAuth2 Login的默认回调端点格式为{baseUrl}/login/oauth2/code/{registrationId},你可以直接使用这个默认路径,修改配置:
spring.security.oauth2.client.registration.my-idp.redirect-uri={baseUrl}/login/oauth2/code/my-idp
如果必须使用自定义的/v4/loginWithOpenId路径,需在Security配置中明确指定该路径为OAuth2回调端点:
@Configuration public class SecurityConfiguration { @Bean public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { return http .authorizeHttpRequests(authorizeConfig -> { authorizeConfig.antMatchers("/v4/register").authenticated(); authorizeConfig.anyRequest().permitAll(); }) .oauth2Login(oauth2 -> oauth2 .redirectionEndpoint(redirConfig -> redirConfig.baseUri("/v4/loginWithOpenId") // 绑定自定义回调路径 ) ) .build(); } }
2. 移除自定义回调端点代码
删除你编写的@GetMapping("/loginWithOpenId")方法,Spring会自动完成授权码接收、向token端点发送POST请求换取Access Token的全流程。
获取Access Token的正确方式
Spring会将换取到的Access Token保存在OAuth2AuthorizedClient对象中,你可以通过以下两种方式获取:
方式一:通过OAuth2AuthorizedClientService注入
@Controller public class TokenController { private final OAuth2AuthorizedClientService authorizedClientService; public TokenController(OAuth2AuthorizedClientService authorizedClientService) { this.authorizedClientService = authorizedClientService; } @GetMapping("/get-access-token") @ResponseBody public String getAccessToken(Authentication authentication) { // 根据注册ID和当前用户加载授权客户端 OAuth2AuthorizedClient client = authorizedClientService.loadAuthorizedClient( "my-idp", authentication.getName() ); return client.getAccessToken().getTokenValue(); } }
方式二:使用@RegisteredOAuth2AuthorizedClient注解直接注入
@Controller public class TokenController { @GetMapping("/get-access-token") @ResponseBody public String getAccessToken( @RegisteredOAuth2AuthorizedClient("my-idp") OAuth2AuthorizedClient client ) { return client.getAccessToken().getTokenValue(); } }
验证注意事项
- 确保OAuth2服务器已配置对应的回调地址(默认路径或自定义路径),否则会出现回调失败
- 检查
spring.security.oauth2.client.provider.my-idp.token-uri是否指向正确的token交换端点 - 确认
client-id和client-secret与OAuth2服务器配置完全一致
内容的提问来源于stack exchange,提问作者João Sousa
相关产品推荐
相关产品推荐

