登录Keycloak时出现Too many redirects错误求助
解决Keycloak通过AWS ELB访问时登录重定向过多的问题
我之前在生产环境里碰到过一模一样的场景,这种重定向循环问题几乎都和请求头识别、Keycloak外部URL配置或者Cookie属性不匹配有关,下面是几个经过验证的解决方案:
1. 让Keycloak正确识别代理传来的请求信息
AWS ELB会把用户的原始HTTPS请求信息通过X-Forwarded-Proto、X-Forwarded-Port这类头传递给后端,但Keycloak默认没开启解析这些头的功能,导致它误以为自己在处理HTTP请求,进而强制重定向到HTTPS,形成死循环。
需要修改Keycloak的核心配置文件(比如standalone.xml或standalone-ha.xml):
- 在
undertow子系统里,给HTTP/HTTPS监听器开启proxy-address-forwarding:
<server name="default-server"> <http-listener name="default" socket-binding="http" redirect-socket="https" proxy-address-forwarding="true"/> <https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" proxy-address-forwarding="true"/> </server>
- 同时在Keycloak控制台(或配置文件的
spi节点)设置**前端URL(Frontend URL)**为ELB的公网HTTPS地址,比如https://your-elb-domain.com/auth(Keycloak 17+版本路径可能是/)。这个配置会让Keycloak生成跳转链接时用外部公网地址,而不是内部的8443端口。
2. 检查ELB的转发规则和头传递
不管是经典型ELB还是ALB,都要确保:
- 监听器会把
X-Forwarded-Proto、X-Forwarded-Port、X-Forwarded-For这些头完整传递给后端Keycloak - ALB的目标组要选择和Keycloak匹配的协议版本(比如HTTP/1.1),避免协议不兼容导致头丢失
- 健康检查路径要用Keycloak的健康端点(比如
/auth/health或/health),确保ELB只会把请求转发到正常运行的实例
3. 强制Cookie使用Secure属性
第一次访问时Keycloak生成的Cookie可能是HTTP属性,但后续请求是HTTPS,浏览器会拒绝发送这些Cookie,导致Keycloak认为用户未登录,再次重定向到登录页,形成循环。
可以在Keycloak配置里强制Cookie为Secure:
在standalone.xml的keycloak-server子系统中添加:
<spi name="cookie"> <provider name="default" enabled="true"> <properties> <property name="secure" value="true"/> <property name="sameSite" value="None"/> </properties> </provider> </spi>
这样生成的Cookie只会通过HTTPS传输,避免浏览器因协议不一致拒绝Cookie。
4. 用浏览器工具排查重定向细节
如果以上配置都没解决问题,打开浏览器开发者工具的Network面板,查看每次重定向的:
- 状态码(302)和目标URL,确认是跳转到ELB的外部地址还是Keycloak的内部8443地址
- 请求头里是否有
X-Forwarded-Proto: https,如果没有,说明ELB没正确传递这个头,Keycloak会误判请求协议
总结
核心就是让Keycloak明确知道自己是通过HTTPS代理对外提供服务的,这样它生成的跳转链接、Cookie属性都会符合HTTPS环境要求,从根源上消除重定向循环。按上面的步骤配置后,不需要清理缓存也能彻底解决问题。
内容的提问来源于stack exchange,提问作者France Belua
相关产品推荐
相关产品推荐

