nginx反向代理后面的Keycloak空白页

nginx反向代理后面的Keycloak空白页

解压并启动 keycloak 监听 127.0.0.1 后,我将 nginx 配置为可通过 https 从公开可用域访问的反向代理。

这是 nginx 配置:

http
{
    server_tokens off;

    upstream keycloak { ip_hash; server 127.0.0.1:8080; }

    server
    {   
        server_name name.domain.tld;
        listen 443 ssl http2; # managed by Certbot
        ssl_certificate /path/to/cert; # managed by Certbot
        ssl_certificate_key /path/to/key; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

        location /
        {   
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            add_header Access-Control-Allow-Origin *;
            proxy_pass http://keycloak;
        }
    }


    server
    {   
        server_name name.domain.tld;
        listen 80;
        location / { return 301 https://$server_name; }
    }

}

keycloak 目录内的任何文件均未发生任何改变。

Keycloak 可以访问,但是当导航到登录页面时,由于来自的混合内容 javascript,我遇到一个空白页/auth/js/keycloak.js?version=df45z

可以通过禁用浏览器对混合内容的保护来暂时解决这个问题,但是这会导致登录页面无法正常运行,并显示以下错误消息:We are sorry... Invalid parameter: redirect_uri

此外, 返回了 HTTP 400 /auth/realms/master/protocol/openid-connect/auth?client_id=security-admin-console&redirect_uri=https%3A%2F%2Fname.domain.tld%2Fauth%2Fadmin%2Fmaster%2Fconsole%2F&state=5abb646f-d1c8-49ef-8ae1-9358bfc50d6d&response_mode=fragment&response_type=code&scope=openid&nonce=525b593c-07ab-4afa-8ca0-bd64499061eb

(希望它的来源有任何价值)

以前与此问题相关的问题仅建议添加 proxy_set_header 指令,这避免了您访问 keycloaks 网页时看到的初始仪表板出现空白屏幕,但对后面提到的问题没有帮助。

如果我错过了一些琐碎的事情,请考虑到我对这个主题还很陌生。

非常感谢任何关于修复此行为的建议。

答案1

您的 Nginx 配置看起来不错。我最近遇到了和您一样的问题,并且 Nginx 配置也差不多。

我唯一需要做的就是更新 KeyCloak 文件夹中的独立配置文件。您可以在 找到此文件keycloak_folder/standalone/configuration/standalone.xml

在这里您必须寻找以下内容(+- 第 572 行):

<server name="default-server">
    <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true" />
    ...
</server>

并添加proxy-address-forwarding=true如下内容:

<server name="default-server">
    <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true" proxy-address-forwarding="true" />
    ...
</server>

这将确保您的内部 KeyCloak JBoss 服务器知道代理地址。

答案2

Keycloak 接受PROXY_ADDRESS_FORWARDING放置在standalone.xml

<http-listener name="default" socket-binding="http" redirect-socket="https" proxy-address-forwarding="${env.PROXY_ADDRESS_FORWARDING:false}" enable-http2="true"/>

PROXY_ADDRESS_FORWARDING使用 docker -e 或 docker-composeenvironment部分提供给 docker

答案3

Thorchy 还写道:

我在 nginx 上启用了 http_auth。从配置中删除 nginx 后,我忘记重新启动它了。

通过重新启动 nginx 禁用 http_auth 最终解决了问题。

答案4

最后我解决了这个问题。

谷歌上的大多数答案是将其设置PROXY_ADDRESS_FORWARDING为 true。但在我的环境中不起作用。

终于我看到了这个答案:https://github.com/codecentric/helm-charts/issues/271#issuecomment-920600882

我设置后KEYCLOAK_FRONTEND_URL,它现在工作了

添加以下环境变量。

KEYCLOAK_FRONTEND_URL=https://{{ URL }}/auth

相关内容