CSRF验证不适用于使用HTTPS的Django

时间:2016-08-09 02:26:11

标签: django cors django-rest-framework ibm-cloud django-csrf

我正在开发一个应用程序,前端是一个AngularJS API,它向Django Rest Framework中开发的后端API发出请求。

The frontend is on the domain: https://front.bluemix.net
And my backend is on the domain: https://back.bluemix.net

我在从前端API向后端API发出请求时遇到问题。错误是这样的:

Error: CSRF Failed: Referer checking failed - https://front.bluemix.net does not match any trusted origins.

我正在使用CORS,我已经在Django后端API的settings.py中包含以下行:

ALLOWED_HOSTS = []

CORS_ALLOW_CREDENTIALS = True

CORS_ORIGIN_ALLOW_ALL = True

CORS_ALLOW_CREDENTIALS = True


CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net/']

CORS_REPLACE_HTTPS_REFERER = True

CSRF_COOKIE_DOMAIN = 'bluemix.net'

CORS_ORIGIN_WHITELIST = (
    'https://front.bluemix.net/',
    'front.bluemix.net',
    'bluemix.net',
)

任何人都知道如何解决这个问题?

2 个答案:

答案 0 :(得分:22)

您的CSRF_TRUSTED_ORIGINS设置错误 - 将其更改为:

CSRF_TRUSTED_ORIGINS = ['front.bluemix.net']

该设置需要hostname only,而不是方案。无论如何,方案是多余的,因为该设置仅在通过HTTPS连接时有任何影响。

您可能还需要在ALLOWED_HOSTS ...

中添加内容

答案 1 :(得分:4)

对于关注此操作的任何人,如果您已将CORS_ORIGIN_ALLOW_ALL设置为True,那么您不再需要设置CORS_ORIGIN_WHITELIST变量,因为您已经允许每个主机。

解决我的问题 - 这可能有助于某人

我们遇到的问题非常奇怪,我们有一个客户端应用程序使用 TokenAuthentication 向另一个应用程序发送请求,这是一个使用Django Admin构建的CRM,因此使用 SessionAuthentication 。当我们打开Django Admin应用程序时, SessionMiddleware 会自动为该域创建 session_id cookie。打开客户端应用程序并尝试执行请求时,我们收到以下错误:

Error: CSRF Failed: Referer checking failed - https://domainofthedjangoadminapp.com does not match any trusted origins.

这只是因为 session_id Cookie已在浏览器中设置,因此请求是使用 SessionAuthentication 而非 TokenAuthentication 进行的,失败。

删除cookie显然解决了这个问题。