Keycloak 25.x.x迁移后登录失败:未发送KC_RESTART Cookie
原使用Keycloak 20.0.5版本,搭配以下配置可正常运行:
Dockerfile
FROM quay.io/keycloak/keycloak:25.0.0 as builder WORKDIR /opt/keycloak FROM quay.io/keycloak/keycloak:25.0.0 COPY --from=builder /opt/keycloak/ /opt/keycloak/ RUN mkdir -p /opt/keycloak/themes/custom_theme COPY ./custom_theme /opt/keycloak/themes/custom_theme COPY ./sds-sms-authenticator-0.0.16.jar /opt/keycloak/providers/custom_provider.jar RUN /opt/keycloak/bin/kc.sh build ENTRYPOINT ["/opt/keycloak/bin/kc.sh"]
K8s部署环境变量
env: - name: KEYCLOAK_ADMIN value: admin - name: KEYCLOAK_ADMIN_PASSWORD value: admin_password - name: KC_PROXY value: edge - name: KC_DB value: postgres - name: KC_DB_URL value: jdbc:postgresql://sample.rds.amazonaws.com/sample_dev - name: KC_DB_SCHEMA value: keycloak - name: KC_DB_USERNAME value: db_app_user - name: KC_DB_PASSWORD value: db_password - name: KC_HEALTH_ENABLED value: "true" - name: KC_METRICS_ENABLED value: "true" - name: KC_HTTP_RELATIVE_PATH value: /my-keycloak-service/
公网Ingress配置
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: creationTimestamp: "2024-07-11T07:25:56Z" generation: 3 name: my-keycloak-public-ingress namespace: my resourceVersion: "200565111" uid: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx spec: ingressClassName: public-nginx rules: - host: xxx.ap-southeast-1.elb.amazonaws.com http: paths: - backend: service: name: my-keycloak-service port: number: 8080 path: /my-keycloak-service(/|$)(.*) pathType: Prefix status: loadBalancer: ingress: - ip: xx.xxx.xx.xxx
问题现象
迁移至Keycloak 25.x.x版本后,本地运行正常,但输入管理员登录凭证后出现错误页面。排查发现请求http://xxx.ap-southeast-1.elb.amazonaws.com/my-keycloak-service/realms/master/login-actions/authenticate未携带KC_RESTART Cookie。
已尝试操作
在Dockerfile中添加以下环境变量,但问题未解决:
ENV KC_HOSTNAME_STRICT=false ENV KC_HOSTNAME_STRICT_HTTPS=true ENV KC_HTTP_ENABLED=false
更新信息
通过浏览器调试发现:输入用户凭证前,浏览器从http://xxx.ap-southeast-1.elb.amazonaws.com/sales-and-distribution-keycloak-service/realms/master/protocol/openid-connect/auth的响应中收到了Cookie,但未保存该Cookie。
解决方案/排查指导
- 检查Cookie的SameSite属性:Keycloak 25.x可能调整了Cookie的SameSite默认值,若Ingress使用HTTP(非HTTPS),SameSite=Strict或Lax可能导致Cookie不被保存。可添加环境变量
KC_SPI_SESSION_COOKIE_SAME_SITE=Lax测试,若使用HTTPS则可设置为None。 - 验证路径匹配一致性:当前Ingress路径规则为
/my-keycloak-service(/|$)(.*),而KC_HTTP_RELATIVE_PATH是/my-keycloak-service/,末尾斜杠可能导致Cookie的Path属性不匹配。尝试将KC_HTTP_RELATIVE_PATH改为/my-keycloak-service(去掉末尾斜杠),或调整Ingress路径规则。 - 修正HTTPS与Cookie Secure属性冲突:当前公网访问为HTTP,但
KC_HOSTNAME_STRICT_HTTPS=true会让Keycloak生成带Secure属性的Cookie,HTTP环境下浏览器会拒绝保存。需:- 要么将ELB配置为HTTPS终止,确保公网访问为HTTPS;
- 要么设置
KC_HOSTNAME_STRICT_HTTPS=false和KC_SPI_SESSION_COOKIE_SECURE=false(仅适用于测试或非生产环境)。
- 清理浏览器缓存与Cookie:旧版本Keycloak的Cookie可能与新版本冲突,强制清理后重新测试。
- 排除自定义主题影响:切换回Keycloak默认主题测试,若恢复正常则说明自定义主题存在Cookie处理逻辑问题。
- 完善代理头传递配置:Edge模式下Keycloak依赖代理传递的
X-Forwarded-*头,需在Ingress中添加注解确保Nginx正确传递:annotations: nginx.ingress.kubernetes.io/use-forwarded-headers: "true" nginx.ingress.kubernetes.io/x-forwarded-proto: "http" # 若使用HTTPS则改为https nginx.ingress.kubernetes.io/x-forwarded-host: "xxx.ap-southeast-1.elb.amazonaws.com"
内容的提问来源于stack exchange,提问作者iuhettiarachchi
相关产品推荐
相关产品推荐

