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}"
验证步骤
- 重启应用后访问
http://localhost:8090 - 完成授权流程后,检查是否能正常进入首页,不再出现循环
- 查看浏览器的Cookie,确认Spring Security创建了会话Cookie(默认名为
JSESSIONID)
内容的提问来源于stack exchange,提问作者ETLJ

