我正在开发一个应用程序,前端是一个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的www.example.com中包含了以下代码行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',
)
有人知道如何解决这个问题吗?
6条答案
按热度按时间z2acfund1#
Django 4.0及以上版本
对于Django 4.0及以上版本,
CSRF_TRUSTED_ORIGINS
必须包含方案和主机,例如:Django 3.2及更低版本
对于Django 3.2及更低版本,
CSRF_TRUSTED_ORIGINS
必须只包含主机名,而不包含方案:您可能还需要在
ALLOWED_HOSTS
中放入一些内容...aor9mmx12#
如果您运行的是Django 4.x,您需要更改语法,将模式作为值的一部分包含进来。
CSRF_TRUSTED_ORIGINS = ['front.bluemix.net']
至CSRF_TRUSTED_ORIGINS = ['https://front.bluemix.net']
https://docs.djangoproject.com/en/dev/releases/4.0/#format-change
tkclm6bt3#
对于任何遵循此规则的人来说,如果您已经将
CORS_ORIGIN_ALLOW_ALL
设置为True
,那么您就不需要再设置CORS_ORIGIN_WHITELIST
变量,因为您已经允许了每台主机。我的问题解决方案-它可能会帮助别人
我们遇到了一个特殊的问题,我们有一个客户端应用程序使用TokenAuthentication向另一个应用程序发送请求,一个CRM使用Django Admin构建,因此使用SessionAuthentication.当我们打开Django Admin应用程序时,SessionMiddleware会自动为该域创建一个session_idcookie.当打开客户端应用程序并尝试执行请求时,我们得到了以下错误:
这仅仅是因为session_idcookie已经在浏览器中设置,因此,请求是使用SessionAuthentication而不是TokenAuthentication发出的,并且失败。
删除cookie显然是在解决问题。
7lrncoxx4#
根据此文档。https://docs.djangoproject.com/en/4.0/releases/4.0/#csrf-trusted-origins-changes
1.通过以下方式安装cors-header:做
pip install django-cors-headers
1.将corsheader添加到已安装的应用
1.将corsheader中间件添加到中间件中
4设置原点
kyxcudwk5#
2022年4月更新:
如果您的django版本是**"4.x.x"**:
然后,如果错误如下所示:
来源检查失败-https://example.com与任何可信来源都不匹配。
将以下代码添加到**"www.example.com":settings.py":
在您的情况下,您得到了与上面类似的错误:
错误:CSRF失败:引用检查失败-https://front.bluemix.net与任何可信来源都不匹配。
因此,您需要将此代码添加到您的"www.example.com":settings.py"**:
ohtdti5x6#
我也面临这个问题。确保域名不包含尾部斜杠。而不是
改成