问题描述
我在继承 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