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

自定义Spring OAuth2授权服务器遇ERR_TOO_MANY_REDIRECTS及State未存问题

OAuth2授权码流自定义授权服务器问题排查与解答

项目修改说明

授权服务器基于Spring官方示例的修改点:

  • 使用Maven构建,JDK版本为jdk1.8.0_xxx,依赖版本:Spring Boot 2.7.12、Spring Security 5.7.8、Spring Security OAuth2 Authorization Server 0.4.2
  • 替换H2数据库为SQL数据库,调整表字段类型:将blob改为varchar,timestamp改为datetime
  • 实现自定义UserDetailsService、SecurityUser及SecurityUserMixin类
  • 移除设备流认证逻辑,调整AuthorizationServerConfig配置
  • 修改OAuth2AuthorizationService以解决issue#397问题

问题现象

  • 浏览器访问客户端时,可正常跳转至授权服务器完成认证与授权,但提交同意后出现ERR_TOO_MANY_REDIRECTS错误,授权服务器持续生成新授权码
  • 日志显示INSERT语句带有STATE值,但数据库oauth2_authorization表中记录的State均为NULL
  • 使用Postman访问资源服务器可正常获取access_token,但State仍未存入数据库
  • 替换为Spring官方授权服务器时,流程完全正常

技术疑问与解答

1. 为何官方授权服务器正常,而自定义版本无法完成跳转?

核心原因是State未正确存入数据库。授权码流中,授权服务器生成授权码后必须将State与授权码关联存储;客户端回调时会携带该State,授权服务器需要校验其合法性。如果State存为NULL,校验逻辑会判定请求非法,触发重新授权流程,最终导致循环重定向。官方版本的State存储与校验逻辑完整,因此流程正常。

2. 降级至无设备流的授权服务器版本是否遗漏了必要配置?

大概率是移除设备流时误删了授权码流所需的State处理相关配置。设备流与授权码流共享部分OAuth2请求处理器,移除设备流时可能误删了OAuth2AuthorizationRequestAuthenticationFilter或State相关的认证管理器配置,导致State无法被正确解析和存储。建议对比官方无设备流的基础示例,检查AuthorizationServerConfig中是否保留了授权码流的完整请求处理链。

3. Spring官方授权服务器中,哪个类负责将State参数存入oauth2_authorization表?

在Spring Security OAuth2 Authorization Server 0.4.2版本中:

  • OAuth2AuthorizationCodeAuthenticationProvider会在生成授权码时,将State封装到OAuth2Authorization对象中;
  • 随后由JdbcOAuth2AuthorizationService(JDBC存储场景下)执行数据库插入操作,将State存入oauth2_authorization表的attributes字段(该字段为JSON格式,State作为其中一个键值对)。
    注意:若你将原blob字段改为varchar,需确保字段长度足够存储完整的JSON格式attributes,否则State可能被截断或无法存入。

4. OAuth2授权码流中State与nonce的校验机制,及相关文档说明

State校验机制

  • 客户端发起授权请求时,生成随机State值,存储在本地(如Cookie),并附加到授权请求URL;
  • 授权服务器接收请求后,将State与授权请求关联存储;
  • 用户授权完成后,授权服务器重定向回客户端,携带授权码和原State值;
  • 客户端收到回调后,对比本地存储的State与回调返回的State,一致则继续流程,否则拒绝请求(核心用于防范CSRF攻击)。

Nonce校验机制

  • 仅在OpenID Connect(OIDC)场景下生效,客户端发起请求时生成随机Nonce并附加到请求;
  • 授权服务器生成ID Token时,将Nonce嵌入Token的nonce字段;
  • 客户端获取ID Token后,解析并校验该Nonce是否与自身生成的一致,防范重放攻击。

相关文档参考

  • Spring Security官方文档:OAuth2授权码流章节中关于State的防护说明
  • OpenID Connect Core 1.0规范:5.3.1节对Nonce参数的定义与校验流程说明

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:23:45