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

Spring Boot 3.2.2中OAuth2授权码流程令牌交换后重定向循环问题

Spring Boot 3.2.2 OAuth2授权码模式重定向循环问题解决

问题核心分析

你遇到的循环本质是:授权回调请求未被Spring Security的OAuth2登录过滤器正确处理,导致令牌交换完成后未建立有效认证会话,后续请求仍被判定为未认证,触发重复授权流程。调试中看到OAuth2AuthorizationCodeAuthenticationProvider已完成令牌交换,但认证状态没被保存到会话,所以浏览器跳转回首页后又被重定向到授权页。

解决方案

1. 修正Redirect URI配置(关键)

Spring Security OAuth2登录默认的回调端点是/oauth2/code/{registrationId},如果自定义了回调路径(比如你的/redirect),必须让Spring Security识别这个路径为OAuth2授权回调端点:

方案A:使用默认回调路径(推荐)

修改配置文件,指定默认的回调URI:

spring.security.oauth2.client.registration.my_registration.redirect-uri="{baseUrl}/oauth2/code/{registrationId}"

同时在授权提供商后台,把回调地址更新为http://localhost:8090/oauth2/code/my_registration。

方案B:保留自定义回调路径

如果必须用/redirect,需要在SecurityFilterChain中显式配置回调端点:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http.authorizeHttpRequests(customizer -> customizer.anyRequest().authenticated())
        .oauth2Login(oauth2 -> oauth2
            // 指定自定义的授权回调路径
            .redirectionEndpoint(redirection -> redirection.baseUri("/redirect"))
        )
        .oauth2Client(Customizer.withDefaults());
    return http.build();
}

确保授权提供商后台的回调地址和/redirect完全一致。

2. 检查会话配置

确认没有禁用Spring Security的会话功能,因为OAuth2登录需要会话保存认证状态。如果配置了sessionCreationPolicy(SessionCreationPolicy.STATELESS),会导致认证信息无法持久化,后续请求仍会被判定为未认证。移除该配置即可。

3. 解决移除Redirect URI启动报错

直接移除redirect-uri配置报错,是因为Spring Boot 3.2.x对自定义OAuth2 Provider的校验更严格。使用默认占位符配置即可避免报错:

spring.security.oauth2.client.registration.my_registration.redirect-uri="{baseUrl}/oauth2/code/{registrationId}"

验证步骤

  1. 重启应用后访问http://localhost:8090
  2. 完成授权流程后,检查是否能正常进入首页,不再出现循环
  3. 查看浏览器的Cookie,确认Spring Security创建了会话Cookie(默认名为JSESSIONID)

内容的提问来源于stack exchange,提问作者ETLJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:56:18