尝试通过 SSH 隧道登录 Django Admin 时出现 403 CSRF 错误

403 CSRF errors when trying to login to Django Admin over an SSH tunnel

我正在尝试通过另一台服务器(比如 123.123.123.123)登录 Django 应用程序的管理面板。我有一个像 ssh -L 3000:my.website.com:443 user@123.123.123.123 这样打开的 ssh 隧道。然后我可以转到 https://localhost:3000/admin/login/ 并查看 my.website.com 上服务器 运行 的 Django 管理员的登录页面。无论我输入什么凭据,都会导致 HTTP 403 'CSRF 验证失败。请求中止。`错误页面。

直接转到 my.website.com/admin/login/ 时我没有收到此错误。哪些设置可能有助于允许通过 SSH 隧道登录?我已经尝试将 'localhost' 添加到 ALLOWED_HOSTS。 CSRF cookie 是安全的(只能通过 HTTPS 访问,我一直在使用它)并且设置了 HTTPOnly 标志。

Django 会看到您正在尝试访问 my.website.com 域,它会向您发回该域的 cookie。

但您的浏览器实际上正在访问 localhost 域,因此 my.website.com 的 cookie 对其无效,浏览器不会将它们发送回 Django 服务器。

修复它的一种方法是使用 /etc/hostsmy.website.com 指向 127.0.0.1,将隧道端口更改为 443 并改为连接到 my.website.com

另一种方法是在您和您的 django 服务器之间设置任何服务器,将 cookie 和其他路径从一个域重写到另一个域。