Dockerize pgAdmin - CSRF 令牌不匹配

问题描述 投票:0回答:6

我一直在尝试解决一个问题,即当我尝试登录 Nginx 代理后面的 pgAdmin(在 docker 容器中)时,出现 CSRF 令牌不匹配的错误。

参见 https://en.wikipedia.org/wiki/Cross-site_request_forgery

坦白说,问题是否与 nginx 相关,我不确定,但配置文件如下:

Docker Swarm 服务 :

pgAdmin:
 image: dpage/pgadmin4
 networks:
   - my-network
 ports:
   - 9102:80
 environment:
   - PGADMIN_DEFAULT_EMAIL=${PGADMIN_DEFAULT_EMAIL}
   - PGADMIN_DEFAULT_PASSWORD=${PGADMIN_DEFAULT_PASSWORD}
   - PGADMIN_CONFIG_SERVER_MODE=True
 volumes:
   - /home/docker-container/pgadmin/persist-data:/var/lib/pgadmin
   - /home/docker-container/pgadmin/persist-data/servers.json:/pgadmin4/servers.json
 deploy:
  placement:
    constraints: [node.hostname == my-host-name]

Nginx 配置

server {

    listen 443 ssl;
    server_name my-server-name;

    location / {

            proxy_pass http://pgAdmin/;
            proxy_redirect off;
            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-CSRF-Token $http_x_pga_csrftoken;
    }

    ssl_certificate /home/nginx/ssl/certificate.crt;
    ssl_certificate_key /home/nginx/ssl/private.key;
    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_prefer_server_ciphers on;
    
server {

    listen 80;
    server_name my-server-name;
    return 301 https://my-server-name $request_uri;

 }

我可以通过两种方式访问 pgAdmin :

  1. 第一种方式是直接主机IP,如172.23.53.2:9102
  2. 第二种方式是通过 Nginx 代理。

当我尝试通过直接主机 IP 访问 pgAdmin 时,没有错误,但是当我尝试通过 dns 访问(如 my-server.pgadmin.com )时,我在登录 pgAdmin 仪表板时收到错误。

错误是:

错误的请求。 CSRF 令牌不匹配。

我对这个错误的第一个看法是 nginx 没有将 CSRF 令牌标头传递给 pgAdmin。由于这些原因,我已经多次更改 nginx 配置文件,但仍然收到此错误。

此错误的根源可能是什么?我该如何解决此问题?

docker nginx pgadmin csrf-token
6个回答
2
投票

尝试使用默认端口“5050:80”。它解决了我这边同样的问题。

还建议使用字符串。

参考:https://docs.docker.com/compose/compose-file/compose-file-v3/#ports


1
投票

我也遇到了同样的问题。

什么有效:

  • 在云耀斑中禁用代理功能。

什么不起作用:

  • 清除cloudflare上的缓存
  • 添加 PGADMIN_CONFIG_WTF_CSRF_CHECK_DEFAULT:“False”

0
投票

我使用Apache httpd部署的pgadmin4, 部署方法类似,我也遇到同样的问题, 我的解决方案是Apache httpd加载了Apr/Aprl-util /pcre的lib,Apache httpd将使用token。


0
投票

作为解决方法,您可以使用 docker 环境在 pgAdmin 中禁用 CSRF 检查。 来自 pgAdmin docker 文档:

PGADMIN_CONFIG_* 这是一个变量前缀,可用于 覆盖 pgAdmin 的 config.py 文件中的任何配置选项。 将 PGADMIN_CONFIG_ 前缀添加到 config.py 中的任何变量名称中,并 对于字符串,以“字符串值”格式给出值,True/False 对于布尔值或 123 对于数字。

在你的 Dockerfile 中添加一个

PGADMIN_CONFIG_WTF_CSRF_CHECK_DEFAULT=False

Flask 将收到

WTF_CSRF_CHECK_DEFAULT=False


0
投票

当我在 Cloudflare 中禁用代理功能时,同样的问题得到了解决,但浏览器表示我的连接在 nginx 代理中使用相同的设置证书 SSL/TLS 并不安全。


0
投票

可能是时钟不同步造成的令牌过期问题。尝试批量添加此行。

    volumes:
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro

之后,您需要清除所有浏览器缓存(如果您已经在非匿名选项卡上打开了 pgadmin,则匿名选项卡是不够的)。在 Firefox 历史记录中,您可以通过右键单击该站点并使用“忘记此站点”选项来仅清除一个站点的缓存。

© www.soinside.com 2019 - 2024. All rights reserved.