我正在创建一个带有React前端和Django REST Framework后端的Web应用程序。由于某些情况,我必须在本地开发React前端,而后端服务器位于远程位置。
后端服务器要求我在登录后为每个POST使用CSRF令牌,并且我应该能够从后端发送的cookie中检索csrftoken。我已经验证了Cookie是通过网络发送的,并且以以下形式包含在响应标头中:
Set-Cookie:csrftoken=******; Domain=localhost; expires=Sat, 09-Dec-2017 18:50:56 GMT; Max-Age=31449600; Path=/
不幸的是,由于前端(localhost)的域和后端域(remote.com)不同,浏览器会忽略此set-cookie标头,我无法访问它。如果我启用CORS_ALLOW_CREDENTIALS(并将localhost指定为接受域),并使用前端的withCredentials,那么cookie确实已设置但在remote.com cookie存储区下,在这种情况下,由于来源相同,我仍然无法访问它cookie访问政策。
如何访问此csrftoken cookie?或者我应该让Django将csrftoken作为身体的一部分发送到某个地方?如果是这样,最简单的方法是什么?
以下是我的settings.py中启用了CORS和CSRF的相关部分。请注意,我正在使用SessionBasedAuthentication。
MIDDLEWARE_CLASSES = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
...
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
]
...
}
# CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = (
'localhost:8080',
)
CORS_ALLOW_CREDENTIALS = True
我正在使用django-corsheaders进行CORS支持,并在我的INSTALLED_APPS中包含了corsheaders。 React前端使用superagent对后端进行AJAX查询。
提前谢谢。
编辑:我也考虑过使用JWT而不是基于会话的身份验证,但是对于浏览器,我可能会将JWT存储在cookie中,在这种情况下我还需要CSRF保护,这会导致回到这个问题。编辑:这个post有一个非常类似的问题,答案很好,但我不明白你如何从不同的来源访问cookie。