通过AWS应用负载均衡器访问Keycloak登录后出现「invalid credentials」错误求助
大家好,我现在碰到一个头疼的问题想请教各位大佬:通过AWS应用负载均衡器(ALB)访问Keycloak完成登录后,总是弹出「invalid credentials」的错误,但直接访问节点上的Keycloak却完全正常。先跟大家说下我的环境配置情况:
我的基础设施与应用配置
- 有两台EC2节点,分别是节点A和节点B,两台节点上都在8082端口运行着业务应用
- 节点A上额外部署了Keycloak(监听8443端口),负责给两台节点8082端口的应用提供统一认证服务
- 两台节点都通过AWS应用负载均衡器对外提供服务,ALB的域名是scdf-01.aws.net
可能的排查方向&解决思路
结合我自己踩过的坑,给你几个可以一步步排查的方向:
1. 先查ALB的会话粘性配置
Keycloak的登录流程非常依赖会话保持,如果ALB把登录后的请求分发到了没有Keycloak会话的节点B,那肯定会报凭证无效。你可以登录AWS控制台,找到对应的ALB目标组,看看有没有开启粘性会话,并且把粘性时长设得足够长(比如30分钟以上),确保登录后的请求一直落到节点A上(毕竟Keycloak只部署在节点A)。
2. 检查Keycloak的前端URL配置
Keycloak的frontendUrl是个很容易踩坑的点!如果你是通过ALB访问的,这个配置必须填ALB的域名,而不是节点A的直接域名。你可以登录节点A的Keycloak后台,进入对应Realm的设置页面,找到「前端URL」选项,确认是不是填的ALB的完整域名(比如scdf-01.aws.net,不用带端口,因为ALB用的是HTTPS默认443端口)。
3. 验证ALB的转发规则与SSL配置
首先确认ALB的SSL证书是覆盖了scdf-01.aws.net这个域名的,然后重点看转发规则:
- 如果你是用同一个ALB域名同时转发应用和Keycloak请求,那得配置路径规则,比如把
/auth/*开头的请求转发到节点A的8443端口,其他路径转发到两台节点的8082端口。一定要确认Keycloak的请求不会被分发到节点B,不然肯定出问题。 - 另外要确认ALB转发请求时,有没有正确传递Host头和Cookie,这些都是Keycloak识别会话的关键。
4. 扒一扒Keycloak的日志找线索
节点A上的Keycloak日志绝对是排错神器!日志一般在/opt/keycloak/logs目录下的server.log文件里,你可以在出现错误的瞬间去拉取日志,看看里面有没有更具体的报错信息——比如是不是Cookie没传对、重定向地址不匹配,或者是Realm配置有问题,这些细节都能在日志里找到答案。
5. 用浏览器开发者工具查Cookie
你可以打开浏览器的F12开发者工具,切换到「Application」标签,在登录Keycloak后看看Cookie的情况:重点看Cookie的Domain属性是不是ALB的域名(scdf-01.aws.net),如果是节点A的域名,那通过ALB访问时Cookie就会被拦截,自然就会报凭证无效。
备注:内容来源于stack exchange,提问作者Gatsby

