本地React前端,Django REST框架后端(在CORS下访问CSRF cookie时遇到问题)

时间:2016-12-10 19:08:27

标签: django cors django-rest-framework csrf

我正在创建一个带有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。

0 个答案:

没有答案