我们在 Hetzner ubuntu 服务器上使用 keycloak 作为容器(连接到同一服务器上的另一个 mysql 容器)。我们有两个阶段——开发和分期。它们的不同之处在于,staging 有 nginx 负载均衡器并使用 HTTPS,而开发没有负载均衡器且仅使用 HTTP。
这是我用于开发的 Dockerfile:
FROM quay.io/keycloak/keycloak:21.0.0 as builder
ENV KC_DB=mysql
ADD ./themes/tediro /opt/keycloak/themes/tediro
RUN /opt/keycloak/bin/kc.sh build
FROM quay.io/keycloak/keycloak:21.0.0
COPY --from=builder /opt/keycloak/ /opt/keycloak/
ENV KC_HOSTNAME_STRICT=false
ENV KC_HOSTNAME_STRICT_HTTPS=false
ENV KC_HTTP_ENABLED=true
ENV KC_HOSTNAME=auth.d-tms.tediro.com
ENV KC_LOGLEVEL=ALL
ENV KC_DB=mysql
ENV KC_DB_URL=jdbc:mysql://mysql:3306/keycloak
ENV KC_DB_USERNAME=keycloak
ENV KC_DB_PASSWORD=xxx
ENV KC_ADMIN=admin
ENV KC_ADMIN_PASSWORD=xxx
ENV KC_FEATURES=admin-fine-grained-authz
ENV KC_CACHE=local
ENV PROXY_ADDRESS_FORWARDING=false
ENV JDBC_PARAMS="useSSL=false&allowPublicKeyRetrieval=true&connectTimeout=50000"
ENV JAVA_TOOLS_OPTIONS="-Djboss.as.management.blocking.timeout=30000"
ENV JAVA_OPTIONS="-Djboss.as.management.blocking.timeout=6000"
ENTRYPOINT ["/opt/keycloak/bin/kc.sh", "start-dev"]
这是为了舞台:
FROM quay.io/keycloak/keycloak:21.0.0 as builder
ENV KC_DB=mysql
ADD ./themes/tediro /opt/keycloak/themes/tediro
RUN /opt/keycloak/bin/kc.sh build
FROM quay.io/keycloak/keycloak:21.0.0
COPY --from=builder /opt/keycloak/ /opt/keycloak/
ENV KC_HOSTNAME_STRICT=false
ENV KC_HOSTNAME_STRICT_HTTPS=true
ENV KC_HTTP_ENABLED=false
ENV KC_HOSTNAME=auth.s-tms.tediro.com
ENV KC_LOGLEVEL=ALL
ENV KC_DB=mysql
ENV KC_DB_URL=jdbc:mysql://mysql:3306/keycloak
ENV KC_DB_USERNAME=keycloak
ENV KC_DB_PASSWORD=xxx
ENV KC_ADMIN=admin
ENV KC_ADMIN_PASSWORD=xxx
ENV KC_FEATURES=admin-fine-grained-authz
ENV KC_CACHE=local
ENV KC_PROXY=edge
ENV PROXY_ADDRESS_FORWARDING=true
ENV JDBC_PARAMS="useSSL=true&allowPublicKeyRetrieval=true&connectTimeout=50000"
ENV JAVA_TOOLS_OPTIONS="-Djboss.as.management.blocking.timeout=30000"
ENV JAVA_OPTIONS="-Djboss.as.management.blocking.timeout=6000"
ENTRYPOINT ["/opt/keycloak/bin/kc.sh", "start"]
虽然分期工作正常,但我们在开发方面遇到了问题。
在应用程序代码中,我们使用 keycloak-js 并调用
keycloak.login()
打开 keycloak 托管的登录页面。此页面设置 2 个 cookie: AUTH_SESSION_ID_LEGACY 和 KC_RESTART 。单击登录按钮后,这些 cookie 应该被发送(至少在登台时发生),但它们不会在开发时发送。这会导致 Cookie not found. Please make sure cookies are enabled in your browser.
错误。
问题与浏览器设置无关,因为它在任何地方、每个人身上都会发生。 Cookies Secure / SameSite 选项似乎是正确的。
keycloak 不发送 cookie 的原因可能是什么?
尝试使用 keycloak dockerfile 中的所有选项。
要使 cookie 发挥作用,您必须使用 HTTPS,即使是在本地也是如此。由于同一站点问题,HTTP 将阻止 OpenID-Connect 涉及的许多 cookie。
我在这篇博文中写了有关如何检测和诊断 cookie 问题的博客:https://nestenius.se/2023/10/09/debugging-cookie-problems/