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

Spring Security集成Okta配置自定义重定向URI出现Too Many Redirects问题

Spring Security OAuth2自定义重定向URI死循环问题解决方案

问题根因

你遇到的循环问题本质是OAuth2授权回调时的重定向URI校验不通过:

  • 当你使用{baseScheme}://{baseHost}{basePort}{basePath}模板时,Spring Security在生成发往Okta的重定向地址时,会按你期望的https生成,所以Okta侧的配置匹配,回调能正常回到应用。
  • 但应用实际运行在http协议下,负载均衡转发到应用的请求scheme是http,Spring Security处理回调请求时,会把当前请求的参数代入你配置的redirect-uri模板,得到的校验值是http开头的地址,和你配置中预期的https开头的地址不一致,校验失败。
  • 校验失败后,OAuth2授权码流程不会执行,系统认为当前请求用户未认证,就会再次重定向到/oauth2/authorization/okta授权端点,进而触发循环。
  • 而{baseUrl}模板是直接基于当前请求的实际地址生成,所以校验时不会出现不匹配的问题,流程正常。

解决方案

方案1:开启转发头识别(推荐)

负载均衡转发请求时会携带X-Forwarded-Proto、X-Forwarded-Host等原始请求信息,你只需要让Spring正确识别这些头即可,在配置文件中添加:

# Spring Boot 2.2+ 版本配置
server.forward-headers-strategy=framework

# 低版本Spring Boot使用这个配置
# server.use-forward-headers=true

开启后Spring会自动从转发头中获取原始的https协议、域名等信息,此时你配置的{baseScheme}模板在生成和校验时都会取到https值,校验一致,流程就能正常运行。
如果你的负载均衡IP不在默认的内网段,还需要额外配置允许的代理地址:
server.tomcat.remoteip.internal-proxies=你的负载均衡IP段

方案2:直接写死重定向URI

如果你的应用域名固定,也可以直接写完整的重定向地址,避免模板替换的匹配问题:
spring.security.oauth2.client.registration.okta.redirect-uri=https://你的应用域名/login/oauth2/code/okta

日志差异说明

你看到的日志差异正好对应校验结果:

  • 正常流程中redirect-uri校验通过,会执行授权码兑换token、生成认证信息的逻辑,触发会话ID变更的安全策略。
  • 异常流程中校验失败,OAuth2认证逻辑不执行,请求被判定为匿名访问,进而触发重定向到授权端点的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:06:04