我有一个Django应用程序,主要在domain.com下运行,但也在其他域下(主要用于测试)。我还有一个单独的子域,为用户提供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也需要适用于需要运行的不同测试。
任何人都可以告诉我我应该如何设置它?我决定将应用程序部署到一个单独的服务器的那一天,但应该将应用程序部署和API部署分开出于其他原因...它只是让我疯狂。
提前致谢。
- 已编辑以添加其他信息 -
为了它的价值,我也在使用CORS保护。看起来在这种情况下我可能应该使用某种CORS头而不是CSRF,但我不完全理解CORS机制,足以了解这是否是解决方案的所在。我确实已将apps.domain.com
列入白名单,但这并不适用于登录,也许还有其他终端(无法通过登录检查其他终端)。
答案 0 :(得分:4)
在1.9中,添加了CSRF_TRUSTED_ORIGINS
设置。您可以将其设置为在csrf referrer check中有效的(子)域列表:
CSRF_TRUSTED_ORIGINS = ['api.domain.com', 'apps.domain.com', 'stagingX.otherdomain.com']
在api.domain.com
的设置文件中设置此项,它将接受来自所有3个域的POST请求。