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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:25:11