
解壓縮並啟動 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_FORWARDING
env 並放置在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