尽管继承了通用视图和 CSRF 中间件,但未验证 Django CSRF 令牌

问题描述

我在继承 generics.CreateAPIView 的 DRF 视图上有一个 POST 请求,并且在中间件中启用了 CSRF,但尽管它没有验证我的 CSRF 令牌,但我不确定为什么不?

这是我的观点:

class SchemeView(generics.CreateAPIView):
    queryset = SchemeModel.objects.get_queryset()
    serializer_class = SchemeModelGraphSerializer

    def post(self,request,*args,**kwargs):
        try:
            ----Business Logic Code -----
            return Response(result,status=status.HTTP_200_OK)
        except Exception as e:
            return Response("Error: %s" % (e),status=status.HTTP_400_BAD_REQUEST)

中间件:

MIDDLEWARE = {
    'django.middleware.common.CommonMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','corsheaders.middleware.CorsMiddleware','RMS.middleware.AuthTokenMiddleware'
}

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'RMS.authentication.JWTAuthentication','rest_framework.authentication.TokenAuthentication',),'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer','DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',}

CSRF 设置:

CSRF_COOKIE_SECURE = False
CSRF_COOKIE_HTTPONLY = True

为 FE 使用 React,为 BE 使用 Django,CSRF Cookies 确实与请求一起发送到 Django 服务器。

我尝试更改 CSRF cookie 值,但 Django 地忽略它。

注意:有些人建议与令牌身份验证一起,不需要 CSRF。但我不明白为什么?

此外,不将 CSRF 与 Token Auth 一起使用,不会为 Django 忽略 CSRF 验证提供解决方案。我更好奇为什么它没有得到验证?

解决方法

您的问题是因为您使用的是 TokenAuthentication 而不是 SessionAuthentication

SessionAuthentication 的构建方式是,如果您在请求中提供有效会话,它将开启 CSRF 验证。

如果您确实认为有必要,我会建议您仅使用 2 种身份验证方法,因为这可能会不必要地使您的项目复杂化。

如果您选择同时使用它们。考虑检查this