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 是可以存取的,但是當導航到登入頁面時,由於/auth/js/keycloak.js?version=df45z.

這可以透過停用瀏覽器對混合內容的保護來暫時解決,但這將使我進入功能失調的登入頁面,並給出以下錯誤訊息:We are sorry... Invalid parameter: redirect_uri

此外,也從 .net 回傳了 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_FORWARDINGenv 並放置在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

除了托奇所寫的之外:

我在 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

相關內容