Django(DRF)&Reaction-禁用(未设置CSRF Cookie) [英] Django (DRF) & React - Forbidden (CSRF cookie not set)

查看:21
本文介绍了Django(DRF)&Reaction-禁用(未设置CSRF Cookie)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有数十个问题与我要问的问题基本相同。然而,他们的答案似乎都不适合我。

我使用axios向后端发送请求的Reaction前端。示例
const request = await axios.post('${BASE_URL}/logout/')

大多数Django REST框架端点都是使用视图集创建的。然而,我有几个是定制的,主要是为身份验证而定制的。

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获取存储在Cookie中的CSRF令牌,并且需要在每个请求的头中传递该令牌。有些回答说我所需要做的就是配置AXIOS,如下

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

而且它将"恰到好处"。我已尝试将我的CSRF_COOKIE_NAME调整为各种值,以使其也正常工作。

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

我真的需要生成/获取CSRF Cookie吗?我是否要在每次请求时都包括它?或者这只是AXIOS的配置?

推荐答案

我曾经遇到过这个问题,当时我正在使用令牌身份验证。我就是这么解决的。但不确定这是不是最好的主意。我只对此视图使用了CSRF_EXPENT,所有其他视图都是视图集。

@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',
]

这篇关于Django(DRF)&Reaction-禁用(未设置CSRF Cookie)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆