Django 站点突然要求用户清除他们的 cookie 以获取 CSRF 令牌

Django site suddenly requiring users to clear their cookies to get a CSRF token

我 运行 一个 Django 网站在过去几个月没有进行任何更新,但突然间我收到了用户的一堆电子邮件,说他们收到以下错误:

CSRF Failed: CSRF cookie not set.

奇怪的是刷新页面并不能解决问题。解决它的唯一方法是让他们手动清除浏览器的 cookie。

请记住,他们在刷新后仍然处于登录状态。因此,即使他们没有收到 CSRF cookie,Django 也会确认他们的会话。

虽然我很高兴他们可以清除他们的 cookie 来修复它,但这让我很担心,因为我无法理解正在发生的事情。它大约在 iOS 14.5 发布的同时开始发生,所以我最初认为它可能与此有关,但我刚刚收到来自 Android 用户的报告。

有没有人运行以前参与过这个?有什么方法可以解决这个问题,而无需在网站上放置一个横幅来解释在您看到错误时清除 cookie?

谢谢!

感谢您的意见和建议!我最终弄清楚发生了什么事。

因此,出于某种原因,如果会话 cookie 仍然有效,Django 将不会创建新的 CSRF cookie(即使它已经 expired/deleted)。这似乎是一个错误,但也许是出于安全原因。

就我而言,我已将 SESSION_COOKIE_AGE 延长至 60 * 60 * 24 * 365 * 10,即 10 年。原来 CSRF_COOKIE_AGE 的默认值为 1 年。因此,登录一年的每个人都不再拥有有效的 CSRF cookie,并且 Django 不会向他们发布新的,因为他们的会话在接下来的 9 年内仍然有效。