CSRF 因 Django 应用程序服务的多个域(不是子域)而失败

CSRF fails with multiple domains (not subdomains) served by Django app

我有一个主要在 domain.com 下提供服务的 Django 应用程序,但也在其他域下提供服务(主要用于测试)。我还有一个单独的子域,用于为用户提供 Web 应用程序客户端代码。

API 的主域是 api.domain.com,正在将应用程序部署到 apps.domain.com。登台服务器不在同一个域名下;他们住在 stagingX.otherdomain.com。这是我无法控制的。

我遇到的问题是当我尝试从 apps.domain.com:

登录时遇到 CSRF 失败
Failed to load resource: the server responded with a status of 403 (OK)
login error: "CSRF Failed: Referer checking failed - http://apps.domain.com/ does not match https://api.domain.com/."

这是一个简单的世界,我只需将 CSRF_COOKIE_DOMAIN 设置为 *.domain.com 即可完成。然而,这完全破坏了我在部署之前暂存代码的能力,因为在 stagingX.otherdomain.com 直接访问 API 也需要为需要 运行.[=19= 的不同测试工作]

任何人都可以告诉我我应该如何设置它吗?我决定将应用程序部署到单独的服务器的那一天,但由于其他原因,应用程序部署和 API 部署应该分开……这让我抓狂。

提前致谢。

-- 已编辑以添加更多信息 --

为了它的价值,我也在使用 CORS 保护。在这种情况下,看起来也许我应该使用某种 CORS header 而不是 CSRF,但我对 CORS 机制的理解还不够充分,无法理解这是否是解决方案所在。我确实已将 apps.domain.com 列入白名单,但这不适用于登录,也可能不适用于其他端点(无法通过登录来检查其他端点)。

在 1.9 中,添加了 CSRF_TRUSTED_ORIGINS 设置。您可以将其设置为在 csrf 引荐来源检查中有效的(子)域列表:

CSRF_TRUSTED_ORIGINS = ['api.domain.com', 'apps.domain.com', 'stagingX.otherdomain.com']

api.domain.com 的设置文件中设置此项,它将接受来自所有 3 个域的 POST 请求。