自定义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
相关产品推荐
相关产品推荐

