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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django(DRF)和React - 禁止(未设置CSRF cookie)相关的知识,希望对你有一定的参考价值。

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

我有一个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获得一个存储在cookie中的CSRF令牌,我需要在每个请求的标题中传递它。一些答案说我需要做的就是配置axios

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

它将“正常工作”。我已经尝试将我的CSRF_COOKIE_NAME调整为各种值以使其工作。

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

我是否真的需要生成/获取CSRF cookie?我是否将其包含在每个请求中?或者它只是axios的配置?

答案

我有一次这个问题,我正在使用令牌认证。这就是我解决它的方式。但不确定如果这是最好的主意。我只在此视图中使用了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',
]

以上是关于Django(DRF)和React - 禁止(未设置CSRF cookie)的主要内容,如果未能解决你的问题,请参考以下文章

带有 React 的 Django DRF:如何获取 CSRF cookie?

如何在 AWS Elastic Beanstalk 上使用 Nginx、React、Webpack、Gunicorn、PostgreSQL、Django 和 DRF 部署应用程序?如何使用此应用程序处

获取 403(禁止)React + Django

用于 Django3 + DRF 身份验证的 AWS Cognito

react.js 基于 DRF HTTP OPTIONS 动态生成表单

如何在 AWS 上部署 Django Rest Framework 和 React