Django(DRF)和React-禁止(未设置CSRF cookie)

时间:2019-01-23 06:55:46

标签: django reactjs django-rest-framework axios csrf

有几十个问题基本上与我要问的问题相同。但是,他们的答案似乎都不适合我。

我有一个React前端,我正在使用axios将请求发送到后端。例子
const request = await axios.post('${BASE_URL}/logout/')

大多数Django Rest Framework端点都是使用ViewSets制作的。但是,我有一些是自定义的,主要用于身份验证。

path('createaccount/', views.create_account),
path('me/', views.current_user),
path('logout/', views.logout),
path('login/', views.login),
path('resetpassword', views.reset_password),

对于该项目的开发,我将@csrf_exempt包括在这些视图上方,因为当时我不想处理它。现在我即将进行部署,是时候解决了。

一些答案​​说我需要从Django获取一个CSRF令牌,该令牌存储在cookie中,并且需要在每个请求的标头中传递该令牌。一些答案说,我需要做的就是像配置axios

axios.defaults.xsrfHeaderName = "X-CSRFTOKEN";
axios.defaults.xsrfCookieName = "XCSRF-TOKEN";

它将“正常工作”。我尝试将CSRF_COOKIE_NAME调整为各种值,以使其同样起作用。

有些答案甚至说保留@csrf_exempt,但这听起来像是一个非常非常糟糕的主意。

我实际上是否需要生成/获取CSRF cookie?是否在每个请求中都包含它?还是仅仅是axios的配置?

1 个答案:

答案 0 :(得分:0)

我曾经遇到过这个问题,我正在使用令牌身份验证。我就是这样解决的。但不确定是否是最好的主意。我仅将此视图用于csrf_exempt,其他所有视图均为视图集。

@csrf_exempt
def get_current_user(request, *args, **kwargs):
    if request.method == 'GET':
        user = request.user
        serializer = UserDataSerializer(user)
        return JsonResponse(serializer.data, safe=False)

我在settings.py中的中间件

MIDDLEWARE = [
   'django.middleware.security.SecurityMiddleware',
   'django.contrib.sessions.middleware.SessionMiddleware',
   'corsheaders.middleware.CorsMiddleware',
   # 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
   'django.middleware.common.CommonMiddleware',
   'django.middleware.csrf.CsrfViewMiddleware',
   'django.contrib.auth.middleware.AuthenticationMiddleware',
   'django.middleware.locale.LocaleMiddleware',
   'oauth2_provider.middleware.OAuth2TokenMiddleware',
   'django.contrib.messages.middleware.MessageMiddleware',
   'django.middleware.clickjacking.XFrameOptionsMiddleware',
   'auditlog.middleware.AuditlogMiddleware',
]