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

Posted

技术标签:

【中文标题】使用自定义基本 URL 为 Keycloak docker 配置反向代理【英文标题】:Configure reverse-proxy for Keycloak docker with custom base URL 【发布时间】:2017-11-21 07:58:32 【问题描述】:

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

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

server 
    listen 80;
    server_name example.com;

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

当我尝试访问 http://example.com/keycloak/ 时,我得到一个 keycloak http 重定向到 http://example.com/auth/ 而不是 http://example.com/keycloak/auth/

有什么想法吗?

【问题讨论】:

FrancoisMaturel 建议:location /keycloak proxy_pass http://example.com:8087/keycloak;@FrançoisMaturel 我尝试了您的建议,但没有成功 【参考方案1】:

刚刚测试了@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

默认keycloak配置指向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 请求进行代理。

希望对你有帮助

【讨论】:

这些是依赖步骤吗?或者有 3 种方法来解决这个问题? @nurgasemetey,解决此问题需要所有这些步骤 似乎这种方法会导致细微的语义错误 - 请参阅 issues.jboss.org/browse/KEYCLOAK-11529 以获取当前打击我的示例 ... @col.panic 这似乎与最新版本的 keycloak 有关,如果您找到可行的解决方案,请更新我 @FrançoisMaturel 请参阅回复。 jboss 票 - 我找到了解决方法/解决方案【参考方案2】:

基于@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

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

【讨论】:

【参考方案3】:

从“/keycloak”到“/keycloak/auth”的重定向不起作用。 index.html 和 Base-URL 中的 Redirekt 路由缺少“/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

【讨论】:

遗憾的是,这对 Keycloak v11.0.2 没有帮助 - 可能还有更多实例需要同时更换? @pat-s 有一些新文件:RUN sed -i -e 's/&lt;web-context&gt;auth&lt;\/web-context&gt;/&lt;web-context&gt;keycloak\/auth&lt;\/web-context&gt;/' $JBOSS_HOME/domain/configuration/domain.xml【参考方案4】:

我还可以确认,使用 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

【讨论】:

【参考方案5】:

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

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

    PROXY_ADDRESS_FORWARDING:'真'

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

    psql -U keycloak -d keycloak

    更新领域集 ssl_required='NONE';

    重启 Keycloak

Example for Postgres DB, by Sairam Krish

【讨论】:

以上是关于使用自定义基本 URL 为 Keycloak docker 配置反向代理的主要内容,如果未能解决你的问题,请参考以下文章

创建 keycloak 自定义主题

部署keycloak自定义spi部署

如何在 Keycloak Operator (v13.0.0) 上使用自定义主题?

为Keycloak添加自定义API

如何在 Flask-Appbuilder 中为 OAuth2.0 使用自定义提供程序 [keycloak]?

Keycloak 使用自定义协议映射器从数据库/外部源添加额外声明