我正在开发一个应用程序,前端是一个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',
)
谁知道如何解决这个问题?
您的CSRF_TRUSTED_ORIGINS
设置错误 - 将其更改为:
CSRF_TRUSTED_ORIGINS = ['front.bluemix.net']
设置需要hostname only,而不是计划。无论如何,方案是多余的,因为该设置仅在通过HTTPS连接时有任何影响。
你可能还需要在ALLOWED_HOSTS
中放一些东西......
对于遵循这一点的任何人,如果你已经将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显然是在解决问题。