nginx リバース プロキシの背後にある Keycloak の空白ページ

nginx リバース プロキシの背後にある Keycloak の空白ページ

解凍して keycloak を起動し、127.0.0.1 で listen した後、https 経由で公開ドメインからアクセス可能なリバース プロキシとして動作するように nginx を構成しました。

これは 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 Web ページにアクセスしたときに表示される最初のダッシュボードの空白画面は回避されましたが、後者の問題の解決には役立ちませんでした。

私はこの主題については全くの初心者なので、些細なことを見逃しているかもしれないことをご考慮ください。

この動作を修正するためのアドバイスをいただければ幸いです。

答え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_FORWARDINGdocker -e または docker-composeenvironmentセクションのいずれかで docker に提供します。

答え3

Thorchy 氏の書いた内容に加えて:

nginx で http_auth を有効にしていました。設定から削除した後、nginx を再起動し忘れました。

nginx を再起動して http_auth を無効にすると、最終的に問題が解決しました。

答え4

ついに問題を解決しました。

Google の回答のほとんどは true に設定することですPROXY_ADDRESS_FORWARDING。しかし、私の環境では機能しません。

最終的に私はこの答えを見つけました:https://github.com/codecentric/helm-charts/issues/271#issuecomment-920600882

設定したらKEYCLOAK_FRONTEND_URL動作するようになりました

以下の環境変数を追加します。

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

関連情報