使用自定义基础 URL 为 Keycloak docker 配置反向代理

Configure reverse-proxy for Keycloak docker with custom base URL

如何将 docker keycloak base url 设置为参数?

我有以下 nginx 反向代理配置:

server {
    listen 80;
    server_name example.com;

    location /keycloak {
        proxy_pass http://example.com:8087/;
    }
}

当我尝试访问 http://example.com/keycloak/ I got a keycloak http redirect to http://example.com/auth/ instead of http://example.com/keycloak/auth/

有什么想法吗?

刚刚测试了@home,实际上需要添加多个配置:

1/ 运行 带有 env -e PROXY_ADDRESS_FORWARDING=true 的 keycloak 容器如文档中所述,这是访问 keycloak 的代理方式所必需的:

docker run -it --rm -p 8087:8080 --name keycloak -e PROXY_ADDRESS_FORWARDING=true jboss/keycloak:latest

这里也有解释SO question

2/ 更改keycloak配置文件中的web-context $JBOSS_HOME/standalone/configuration/standalone.xml

默认密钥斗篷配置指向auth

<web-context>auth</web-context>

那你可以改成keycloak/auth

<web-context>keycloak/auth</web-context>

如果您需要为 docker 自动执行此操作,只需创建一个新的 keycloak 映像即可:

FROM jboss/keycloak:latest

USER jboss

RUN sed -i -e 's/<web-context>auth<\/web-context>/<web-context>keycloak\/auth<\/web-context>/' $JBOSS_HOME/standalone/configuration/standalone.xml

3/ 在nginx配置中添加一些代理信息(主要用于http/https处理)

location /keycloak {
    proxy_pass http://example.com:8087;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

如果您在同一台服务器上将来自 nginx 的请求代理到 keycloak,我建议使用 proxy_pass http://localhost:8087;,如果不尝试使用私有网络以避免通过外部 Web 请求进行代理。

希望对您有所帮助

基于@Francois Maturel 的回复:对于最新的 Keycloak(当前为 4.8.x),我还必须添加一行来替换 standalone-ha.xml 中的 web-context :

FROM jboss/keycloak:latest
USER jboss
RUN sed -i -e 's/<web-context>auth<\/web-context>/<web-context>keycloak\/auth<\/web-context>/' /opt/jboss/keycloak/standalone/configuration/standalone.xml
RUN sed -i -e 's/<web-context>auth<\/web-context>/<web-context>keycloak\/auth<\/web-context>/' /opt/jboss/keycloak/standalone/configuration/standalone-ha.xml
RUN sed -i -e 's/\/auth/\/keycloak\/auth/' /opt/jboss/keycloak/welcome-content/index.html

原因是 docker-entrypoint.sh 启动脚本除了 standalone.xml 之外还将使用 standalone-ha.xml 配置,除非传递 -c 标志。看这里:https://github.com/jboss-dockerfiles/keycloak/blob/master/server/tools/docker-entrypoint.sh

/keycloak/keycloak/auth 的重定向无效。 index.htmlBase-URL 中的重定向路由缺少 /keycloak 部分。 我不得不添加这个:

FROM jboss/keycloak:latest

USER jboss

RUN sed -i -e 's/<web-context>auth<\/web-context>/<web-context>keycloak\/auth<\/web-context>/' $JBOSS_HOME/standalone/configuration/standalone.xml
RUN sed -i -e 's/<web-context>auth<\/web-context>/<web-context>keycloak\/auth<\/web-context>/' $JBOSS_HOME/standalone/configuration/standalone-ha.xml
RUN sed -i -e 's/name="\/"/name="\/keycloak\/"/' $JBOSS_HOME/standalone/configuration/standalone.xml
RUN sed -i -e 's/name="\/"/name="\/keycloak\/"/' $JBOSS_HOME/standalone/configuration/standalone-ha.xml
RUN sed -i -e 's/\/auth/\/keycloak\/auth/' $JBOSS_HOME/welcome-content/index.html
RUN sed -i -e 's/<web-context>auth<\/web-context>/<web-context>keycloak\/auth<\/web-context>/' $JBOSS_HOME/domain/configuration/domain.xml

我还可以确认,当使用 docker image keycloak 6.0.1 standalone-ha.xml 文件也需要使用 sed 命令更改...

RUN sed -i -e 's/<web-context>auth<\/web-context>/<web-context>keycloak\/auth<\/web-context>/' /opt/jboss/keycloak/standalone/configuration/standalone.xml
RUN sed -i -e 's/<web-context>auth<\/web-context>/<web-context>keycloak\/auth<\/web-context>/' /opt/jboss/keycloak/standalone/configuration/standalone-ha.xml

就我而言,我在 Docker 上有一个现有的 Keycloak (v8.0.1),所以我也必须更新数据库。

  1. 使用以下环境变量启动 Keycloak Docker 容器:

    PROXY_ADDRESS_FORWARDING: 'true'

  2. 更新数据库。我正在使用 Postgres。

    psql -U keycloak -d keycloak

    更新领域集ssl_required='NONE';

  3. 重启 Keycloak

Example for Postgres DB, by Sairam Krish

在 Keycloak 18.x 中你不能再使用 web-context

现在有一个新参数 http-relative-path,其中包含相对于“/”的路径。

CLI:--http-relative-path

环境:KC_HTTP_RELATIVE_PATH