首页 > 解决方案 > Dockerize pgAdmin - CSRF 令牌不匹配

问题描述

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

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

Docker 群服务

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 Token 标头传递给 pgAdmin。由于这些原因,我已经多次更改了 nginx 配置文件,但仍然出现此错误。

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

标签: dockernginxpgadmincsrf-token

解决方案


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

还建议使用字符串。

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


推荐阅读