在Docker的pgAdmin中出现CSRF令牌缺失错误

24

我正试图创建一个包含pgpgadmindocker-compose堆栈,如下所示:

version: '3.1'
services:
  pg-admin:
    image: dpage/pgadmin4
    volumes:
        - /Users/pkaramol/Desktop/backup.tar:/pgadmin4/dvdrental.tar
    ports:
      - "8181:80"
    environment:
      PGADMIN_DEFAULT_EMAIL: user@domain.com
      PGADMIN_DEFAULT_PASSWORD: 1234
    depends_on:
    - pg
  pg:
    image: postgres:12
    volumes:
      - ./pg-data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: postgres
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    restart: always

但是 pgadmin 的日志显示如下错误:

pg-admin_1  | Traceback (most recent call last):
pg-admin_1  |   File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1811, in full_dispatch_request
pg-admin_1  |     rv = self.preprocess_request()
pg-admin_1  |   File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 2087, in preprocess_request
pg-admin_1  |     rv = func()
pg-admin_1  |   File "/usr/local/lib/python3.8/site-packages/flask_wtf/csrf.py", line 224, in csrf_protect
pg-admin_1  |     self.protect()
pg-admin_1  |   File "/usr/local/lib/python3.8/site-packages/flask_wtf/csrf.py", line 259, in protect
pg-admin_1  |     self._error_response(e.args[0])
pg-admin_1  |   File "/usr/local/lib/python3.8/site-packages/flask_wtf/csrf.py", line 302, in _error_response
pg-admin_1  |     raise CSRFError(reason)
pg-admin_1  | flask_wtf.csrf.CSRFError: 400 Bad Request: The CSRF session token is missing.

有什么建议吗?

7个回答

55

确保在启动容器之前关闭与pgAdmin相关的选项卡。


3
是的,这对我有用。我之前有一个Chrome标签页打开。同时,我重新创建了我的pgadmin实例,所以我猜令牌已经改变了。 - Joseph King
这个非常有效。 - Vikash
仅仅关闭标签页,甚至关闭Chrome浏览器都对我没有用,但是使用清除缓存的方式刷新页面(ctrl+shift+r)就可以了。 - Adam Sałata
1
这对我不起作用。我尝试过清除缓存、隐身模式、重启容器、使用几个不同的浏览器,但我总是收到csrf错误。 - Lewy Blue

8
我在Azure容器应用程序和容器实例中发现了这个问题。每当PGAdmin位于负载均衡器或网关后面时,对我有效的方法是将增强的Cookie保护标志作为.env变量禁用。
PGADMIN_CONFIG_ENHANCED_COOKIE_PROTECTION="False"

希望这能帮助到某些人。

谢谢!我正在使用通过Azure应用程序网关路由的pgadmin,并且这个设置使应用程序能够正常工作。 - pablo.bueti

5
尝试了上面的建议,但没有成功。最后对我有效的是设置了这两个:
PGADMIN_CONFIG_WTF_CSRF_CHECK_DEFAULT: 'False'
PGADMIN_CONFIG_WTF_CSRF_ENABLED: 'False'

我们的设置是: pgadmin 4:7.5(Docker镜像)
运行在Kubernetes中
Ingress-Nginx
AWS ELB

这两个pgadmin配置变量在我使用的Docker v4.23.0上与Apple M1 Max和macOS 13.6兼容。 - undefined

4
也许您在同一台主机上运行了多个pgAdmin实例? 对我们来说,至少这就是问题所在。 关闭其中一个解决了该问题。

1
对我来说,有三个问题。我不确定哪一个解决了它:
  • 禁用了 Cloudflare 缓存,然后清除了缓存
  • 我正在使用非标准端口 8082 而不是 5050
  • 我删除了环境变量 PGADMIN_LISTEN_PORT: 8082

注意,我仍在使用端口 8082 并且可以成功登录。


1

对我来说,只有清除cookies才解决了这个问题。

更新:仅清除cookies只能短暂地解决问题。

将pgadmin v4.25升级到v6.15没有效果-仍然出现CSRF token丢失的问题。

根本原因在于Ngninx代理cookie处理(我的pgadmin docker在nginx代理后面),或者更确切地说是未处理:)

我将pgadmin应用程序从nginx移动到AWS ALB中,并解决了该问题。

我在nginx服务器块中添加了此配置行。

proxy_pass_header    Set-Cookie;

这似乎也解决了问题。


0

我可以从http://127.0.0.1:8701运行它,但是当我在NPM后面使用自定义域时,我遇到了那个错误。好吧,结果证明我正在使用标签4.18,所以也许需要尝试最新版本 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接