我一直在试图解决一个问题,当我试图登录到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配置文件很多很多次,但我仍然得到这个错误。
什么可能是这个错误的来源,我如何解决这个问题?
3条答案
按热度按时间4dbbbstv1#
尝试使用默认端口“5050:80”。我也解决了同样的问题。
还建议使用字符串。
Cf:https://docs.docker.com/compose/compose-file/compose-file-v3/#ports
pbpqsu0x2#
我用的是Apache httpd部署的pgadmin 4,部署方法也差不多,我也遇到了同样的问题,我的解决方案是Apache httpd加载Apr/Aprl-util /pcre的lib,Apache httpd会使用token。
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。