Keycloak Invalid redirect_uri问题:CNAME域名被解析为负载均衡地址
问题解决思路
这问题本质是你的后端服务没拿到用户实际访问的自定义域名api.mydomain.com,反而获取到了负载均衡的DNS地址,导致它向Keycloak请求认证时,传递的重定向URI是负载均衡地址,和你配置的https://api.mydomain.com/*不匹配,触发了Keycloak的安全校验。
1. 检查AWS负载均衡的HTTP头转发配置
AWS负载均衡默认可能不会把原始请求的关键头完全传给后端,你需要确保它正确转发以下内容:
- 对于应用负载均衡(ALB):
- 进入负载均衡的监听器配置,确认转发规则里开启了「转发原始Host头」(一般默认是开的,但最好手动核对)。
- 配置负载均衡添加
X-Forwarded-For、X-Forwarded-Proto、X-Forwarded-Host这三个HTTP头——这三个头是后端服务识别真实请求地址的关键。
- 对于经典负载均衡(CLB):
- 在负载均衡的属性页面,开启「转发客户端IP」和「保留HTTP Host头」选项。
2. 让后端服务信任并使用负载均衡的代理头
你的后端服务需要知道这些X-Forwarded-*头来自可信的负载均衡,并且用这些头来构建正确的重定向URI:
- 如果是Spring Boot后端,在
application.properties里添加以下配置:server.forward-headers-strategy=framework server.tomcat.remote-ip-header=x-forwarded-for server.tomcat.protocol-header=x-forwarded-proto - 如果是Node.js/Express后端,使用
express-trust-proxy中间件,配置信任负载均衡的IP段,让应用用X-Forwarded-Host作为请求的Host。 - 其他语言框架逻辑类似,核心是让服务识别代理传递的真实请求地址,而非负载均衡的地址。
3. 核对Keycloak客户端配置
再确认一遍Keycloak客户端的Valid redirect URIs确实填了https://api.mydomain.com/*,同时检查客户端的「Base URL」不要设成负载均衡的地址,保持和自定义域名一致。
4. 检查SSL终止的协议传递
如果你的负载均衡做了SSL终止(用户访问的是HTTPS,负载均衡和后端之间用HTTP通信),必须确保后端通过X-Forwarded-Proto头拿到原始的HTTPS协议,否则后端可能生成HTTP的重定向URI,同样会被Keycloak拒绝。
内容的提问来源于stack exchange,提问作者Son Hoang
相关产品推荐
相关产品推荐

