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