在 Nginx 代理后面时,Keycloak Docker Instace 中的 X-Frame-Options 拒绝加载

Posted

技术标签:

【中文标题】在 Nginx 代理后面时,Keycloak Docker Instace 中的 X-Frame-Options 拒绝加载【英文标题】:Load Denied by X-Frame-Options In Keycloak Docker Instace When Behind A Nginx Proxy 【发布时间】:2019-01-30 09:13:32 【问题描述】:

我有一个与官方提供的非常相似的 docker-compose 文件,即

version: '3'

volumes:
mysql_data:
    driver: local

services:
mysql:
    image: mysql:5.7
    volumes:
        - mysql_data:/var/lib/mysql
    environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: keycloak
        MYSQL_USER: keycloak
        MYSQL_PASSWORD: mypassword
keycloak:
    image: jboss/keycloak
    environment:
        DB_VENDOR: MYSQL
        DB_ADDR: mysql
        DB_DATABASE: keycloak
        DB_USER: keycloak
        DB_PASSWORD: mypass
        KEYCLOAK_USER: admin
        KEYCLOAK_PASSWORD: mypass
        # It didn't look like this actually got set. 
        PROXY_ADDRESS_FORWARDING: "true"
    ports:
        - 10000:8080
    depends_on:
        - mysql

我还有 nginx 配置文件用作 keycloak 的反向代理

## Redirects all HTTP traffic to the HTTPS host
server 
    listen 80;
    listen [::]:80;
    server_name keycloak keycloak.fqdn.com keycloak.fq.fqdn.com; 
    server_tokens off;
    return 301 https://keycloak.fqdn.com$request_uri;


## HTTPS host
server 
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name keycloak.fqdn.com; 
    server_tokens off; 
    autoindex off;    

    include conf.d/site-common-config/ssl.conf;

    access_log  /var/log/nginx/keycloak-access.log combined;
    error_log   /var/log/nginx/keycloak-error.log warn;

    location / 
        gzip                    on;
        proxy_http_version 1.1;

        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;

        proxy_pass http://127.0.0.1:10000;
    

我进一步确认(据我了解)/auth/realms/master/.well-known/openid-configuration 正在返回正确的值。我一直在关注here 指南并更新了相应的 xml 文件并运行了重新加载命令以确保将proxy-address-forwarding 设置为 true。但是我得到了javascript错误

Load denied by X-Frame-Options: https://keycloak.fqdn.com/auth/realms/master/protocol/openid-connect/login-status-iframe.html?version=4.3.0.final does not permit framing.

到目前为止,我无法在文档中找到任何解决此问题的内容,因此我们将不胜感激。

【问题讨论】:

【参考方案1】:

如果我在 nginx/openresty 配置中添加以下标头,它将起作用:

location / 
     …
     add_header X-Frame-Options "SAMEORIGIN";
     …

如果您想使用 kcadm.sh 更改领域中的值(因为 gui 不起作用),您可以使用导出、编辑和导入领域

sudo -u keycloak /opt/keycloak/bin/kcadm.sh config credentials --realm master --user admin --server http://localhost:8080/auth
sudo -u keycloak /opt/keycloak/bin/kcadm.sh get realms/master > realm.json
# edit realm.json
sudo -u keycloak /opt/keycloak/bin/kcadm.sh update realms/master -f realm.json

【讨论】:

【参考方案2】:

在领域配置中配置X-Frame-Options 并在其中允许您的域。也许您还需要调整Content-Security-Policy

文档:https://www.keycloak.org/docs/latest/server_admin/index.html#clickjacking

【讨论】:

刚刚通过 kcadm.sh 将 xFrameOptions 配置值更新为“allow-from keycloak.fqdn.com”,但不幸的是它不起作用。我会尝试调整 Content-Security-Policy。 不幸的是,我仍然没有得到这个工作我已经通过 kcadm.sh 更新了 X-Frame-Options 值和 Content-Security-Policy,但看起来这些值没有得到根据我仍然收到错误消息的事实进行了更新。因此,我也无法使用 GUI。如果您有更多建议,请告诉我。 我不明白你为什么不能使用 Keycloak GUI 来配置领域设置。 X-Frame-Options 阻止它被渲染。话虽如此,我添加了一个插件来忽略 chromium 中的 x-frame-options 标头,因此它可以正确渲染,然后我更新了防御部分,因此标头应该是敞开的(即 * l),但我仍然得到一个 DENY X- Frame-Option 标头。 x-frame-options 中真的允许“*​​”吗?请阅读链接的 Keycloak 文档和 RFC tools.ietf.org/html/rfc7034 以了解正确的语法。

以上是关于在 Nginx 代理后面时,Keycloak Docker Instace 中的 X-Frame-Options 拒绝加载的主要内容,如果未能解决你的问题,请参考以下文章

keycloak 无效参数:redirect_uri 在反向代理后面

在反向代理后面使用 Keycloak:无法打开管理员登录页面,因为内容混合

带有 NGINX 代理服务器的 Keycloak 未验证 rest api

nginx登录背后的keycloak失败,帖子中缺少端口号等

使用反向代理后面的 keycloak 进行身份验证失败

Keycloak:使用 nginx 后面的 javascript 适配器的重定向循环