nginx Dockerize pgAdmin -CSRF令牌不匹配

vxbzzdmp  于 2023-06-21  发布在  Nginx
关注(0)|答案(3)|浏览(193)

我一直在试图解决一个问题,当我试图登录到Nginx代理背后的pgAdmin(在docker容器中)时,我得到了一个错误,即CSRF令牌不匹配。
参见https://en.wikipedia.org/wiki/Cross-site_request_forgery
坦率地说,这个问题与nginx有关,我不确定,但配置文件如下:

Docker Swarm Service

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
1.第二种方式是通过Nginx代理。
当我尝试通过直接主机IP访问pgAdmin时,没有错误,但当我尝试通过dns(如my-server.pgadmin.com)访问时,我在登录pgAdmin Jmeter 板时遇到错误。
错误是:
错误请求。CSRF令牌不匹配。
我对这个错误的第一个意见是nginx不传递CSRF令牌头到pgAdmin。由于这些原因,我已经更改了nginx配置文件很多很多次,但我仍然得到这个错误。
什么可能是这个错误的来源,我如何解决这个问题?

4dbbbstv

4dbbbstv1#

尝试使用默认端口“5050:80”。我也解决了同样的问题。
还建议使用字符串。
Cf:https://docs.docker.com/compose/compose-file/compose-file-v3/#ports

pbpqsu0x

pbpqsu0x2#

我用的是Apache httpd部署的pgadmin 4,部署方法也差不多,我也遇到了同样的问题,我的解决方案是Apache httpd加载Apr/Aprl-util /pcre的lib,Apache httpd会使用token。

0md85ypi

0md85ypi3#

作为一个解决方案,您可以使用docker的环境在pgAdmin中禁用CSRF检查。从pgAdmin docker文档:
PGADMIN_CONFIG_* 这是一个变量前缀,可用于覆盖pgAdmin的www.example.com文件中的任何配置选项config.py。将PGADMIN_CONFIG_前缀添加到config.py中的任何变量名中,并为字符串给予“string value”格式的值,为布尔值提供True/False,为数字提供123。
在您的Dockerfile中添加PGAADMIN_CONFIG_WTF_CSRF_CHECK_DEFAULT=False
Flask将收到WTF_CSRF_CHECK_DEFAULT=False。

相关问题