Spring Security OAuth2授权码无法获取AccessToken,出现重定向循环
问题分析与解决方案
看起来你的Spring Boot OAuth2客户端没有正确识别授权服务器返回的回调请求,导致重复触发授权流程,最终引发重定向循环。结合你的配置和日志,我梳理了几个关键问题点和修复步骤:
1. 回调端点路径不匹配
你的授权服务器重定向回来的路径是/oauth2/callback/pgm-backend,但在HttpSecurity配置中,你设置的redirectionEndpoint().baseUri("/oauth2/callback")并不包含客户端ID后缀。Spring Security的OAuth2登录回调需要精准匹配回调路径,否则会把请求当成普通未认证请求,重新触发授权流程。
修改redirectionEndpoint的配置,用通配符匹配带客户端ID后缀的路径:
.redirectionEndpoint() .baseUri("/oauth2/callback/*")
或者更精确地匹配你的客户端ID:
.redirectionEndpoint() .baseUri("/oauth2/callback/pgm-backend")
2. 升级OAuth2客户端配置格式
你当前使用的oauth2.client是旧版Spring Security的配置格式,Spring Boot 2.x及以后的版本推荐使用结构化配置,确保配置能被正确加载到OAuth2客户端组件中。
更新你的application.yml配置如下:
spring: security: oauth2: client: registration: pgm-backend: # 这个ID要和回调路径里的后缀完全一致 client-id: pgm-backend client-secret: 2XmrKjm2AJkWrSl2WwaqMBioHHQB6YOgSlaBWR0 authorization-grant-type: authorization_code redirect-uri: "{baseUrl}/oauth2/callback/pgm-backend" scope: - openid - offline provider: pgm-backend: authorization-uri: https://auth.server.com/oauth2/auth token-uri: https://auth.server.com/oauth2/token user-info-uri: https://auth.server.com/userinfo user-name-attribute: sub # 根据授权服务器返回的用户字段调整
3. 修复自定义授权请求解析器的潜在问题
你自定义了OAuth2AuthorizationRequestResolver来覆盖state参数,需要确保:
- 解析器生成的redirectUri和授权服务器返回的回调路径完全一致
- 正确处理state参数的验证逻辑,确保回调请求中的state能被Spring Security匹配,否则会被拒绝并重新触发授权
4. 修正权限配置的路径格式
你当前的antMatchers配置中,oauth2/**前面缺少了斜杠,会导致路径匹配失败,修正后应为:
.antMatchers("/login","/login/**","/oauth2/**") .permitAll()
验证修复流程
完成以上修改后重启应用:
- 访问需要认证的接口,会被正常重定向到授权服务器
- 授权成功后,授权服务器重定向回回调路径,Spring Security会自动识别这是OAuth2回调请求
- 自动调用token端点交换Access Token,之后跳转到最初请求的接口,不再触发重定向循环
内容的提问来源于stack exchange,提问作者Riyaz Mohammed
相关产品推荐
相关产品推荐

