AWS ALB后Node.js Express服务器间歇性CODE_TO_TOKEN_ERROR问题
问题根源与解决方案
核心原因
你的问题出在多节点部署的会话上下文不共享+ALB无会话粘性:
- 首次访问时,请求打到节点A,keycloak-connect在节点A的内存里生成了OIDC授权所需的
state参数,并给浏览器设置了会话cookie。 - 登录完成后,Keycloak的回调请求被ALB转发到了节点B,节点B没有节点A的内存会话,无法匹配回调里的
state,导致向Keycloak交换token时请求参数异常,Keycloak返回invalid_code错误。 - 后续访问时,浏览器已经持有有效的refresh token cookie,此时不管请求到哪个节点,keycloak-connect都会用refresh token直接获取新的access token,无需再使用一次性的authorization code,所以能成功访问,对应日志里的Refresh操作。
修复方案
开启ALB会话粘性
在AWS ALB配置中启用基于cookie的会话粘性,让同一个用户的所有请求都路由到同一个节点,避免跨节点的会话上下文丢失。这是最快的临时修复方案。改用分布式会话存储
不要用Express默认的内存会话,换成Redis这类分布式存储,让所有EKS节点共享会话数据。这样不管请求打到哪个节点,都能获取到OIDC授权流程的state等关键参数,彻底解决多节点会话不一致问题。检查Keycloak相关配置
- 确认Keycloak客户端
camp的Valid Redirect URIs包含你的回调路径(比如https://你的域名/my/web/page/*),避免回调被Keycloak拒绝。 - 确保
keycloak-connect的cookies: true配置生效,且cookie的domain设置正确,能在ALB域名下正常传递。
- 确认Keycloak客户端
验证建议
先尝试开启ALB会话粘性,测试首次认证流程是否正常。如果问题解决,再逐步迁移到分布式会话存储,避免单点故障风险。
内容的提问来源于stack exchange,提问作者bjlevine
相关产品推荐
相关产品推荐

