【问题标题】:Django 2.1 - CSRFToken changeDjango 2.1 - CSRFToken 更改
【发布时间】:2019-03-28 16:04:09
【问题描述】:

我在将我的 DJANGO 应用程序从 1.11 迁移到 2.1 时遇到问题

在开发过程中,我在端口 3000 上有一个 node.js 服务器(前端),在 8000 上有一个 DJANGO 开发服务器。前端使 Ajax 调用受 CSRFtoken 保护。

我有一个使用 @ensure_csrf_cookie 装饰器在前端调用的视图。

第一次我通常不得不去 chrome://net-internals/#events 启动前端,获取从服务器返回的 csrftoken 值,然后创建相关 cookie。不幸的是,cookie 不会使用此配置自动创建。

问题是。即使在完全刷新之后,Django 1.11 也会生成相同的 CSRFToken,因此在第一次之后,cookie 将等于生成的令牌。 Django 2.1 每次都会更改 csrftoken,所以我无法创建 cookie,因为它总是等于之前的值。

为什么 Django 2.1 更改了 csrftoken,即使默认持续时间是 1 年?

【问题讨论】:

  • 我认为您可能会受到ticket 20869 的影响。然而,这表明令牌开始更改 Django 1.10 中的每个请求,所以我不确定为什么您会看到从 1.11 到 2.1 的行为变化。
  • 有没有办法强制 Django 使用相同的令牌?在网上搜索我没有找到任何解决方案
  • 不,没有任何方法可以在不修补 Django 的情况下改变行为。出于安全原因进行了更改,因此您不应尝试撤消它。
  • 我不清楚为什么不能通过向使用 @ensure_csrf_cookie decorator 的视图发出请求来从 cookie 中获取 cookie 值。 cookie 值保持不变,只是每次请求都会更改令牌。
  • 因为在开发模式下,由于服务器端口不同(我想),@ensure_csrf_cookie 不会在客户端存储cookie。所以我必须手动存储,但是如果值发生变化,当客户端读取 cookie 时,我会读取一个旧值,因此在尝试登录时(例如),Django 返回一个关于 CSRF Token 的错误。

标签: django


【解决方案1】:

经过大量搜索,经过Alasdair的回答,找到的唯一解决方案是强制Middleware生成相同的token。

这种方法仅在我的开发特定情况下有效。

转到:

lib/python3.5/site-packages/django/middleware

编辑文件

csrf.py

编辑方法的定义:

def _get_token(self, request):

在任何其他说明之前,用您的令牌写一个回报:

def _get_token(self, request):
        return "1234567890123456789012345678901234567890123456789012345678901234"

【讨论】:

    猜你喜欢
    • 2020-11-08
    • 2016-04-02
    • 2012-11-04
    • 2017-12-04
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    相关资源
    最近更新 更多