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

use*_*468 2 nginx reverse-proxy single-sign-on mixed-content

在解压并启动 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; }
    }

}
Run Code Online (Sandbox Code Playgroud)

keycloak 目录中的任何文件都没有更改。

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

这可以通过禁用浏览器对混合内容的保护来暂时解决,但是这会让我进入一个功能失调的登录页面,给我这个错误消息:“我们很抱歉......无效参数:redirect_uri”。

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

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

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

如果我错过了一些微不足道的东西,请考虑到我对这个主题很陌生。

任何解决此行为的建议都非常感谢。

Tho*_*chy 6

你的 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>
Run Code Online (Sandbox Code Playgroud)

并添加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>
Run Code Online (Sandbox Code Playgroud)

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