【问题标题】:Django (DRF) & React - Forbidden (CSRF cookie not set)Django (DRF) & React - Forbidden (CSRF cookie not set)
【发布时间】:2019-06-16 16:58:53
【问题描述】:

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

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

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

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的配置?

【问题讨论】:

  • 您使用的是什么身份验证机制?如果是会话,那么是的,您需要在每个 (POST, PUT, PATCH, DELETE) 中包含 CSRF 如果是这样,请尝试从 cookie 中获取 github.com/js-cookie/js-cookie 令牌,然后发出请求。
  • 我正在使用 JWT 令牌认证。
  • 你有没有找到这个问题的答案?看来我遇到了一个非常相似的问题。

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


【解决方案1】:

我曾经遇到过这个问题,我使用的是令牌身份验证。我就是这样解决的。但不确定这是否是最好的主意。我只对这个视图使用了 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',
]

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 2022-01-26
    • 2019-03-16
    • 2020-08-17
    • 2017-12-06
    • 1970-01-01
    • 2014-05-13
    • 2018-02-11
    • 2021-04-11
    相关资源
    最近更新 更多