Authentication Django Rest框架中的会话身份验证,这真的是我必须做的,以确保CSRF安全吗?

Authentication Django Rest框架中的会话身份验证,这真的是我必须做的,以确保CSRF安全吗?,authentication,session,django-rest-framework,django-rest-auth,Authentication,Session,Django Rest Framework,Django Rest Auth,首先,这段代码是有效的,但对于如此简单的东西,它感觉不到应有的干净 背景: 我正在尝试在DRF中创建一个自定义登录API端点,该端点将由React前端使用。看起来你必须手动强制csrf以DRF格式发送,所以这就是我所做的 我不想发送Django表单,因为它看起来不是RESTful的,但这是我能找到的唯一避免这种情况的方法。请让我知道这是否是干净的代码 序列化程序.py 从rest\u框架导入序列化程序 从django.contrib.auth导入获取用户模型(如果使用自定义用户模型) UserM

首先,这段代码是有效的,但对于如此简单的东西,它感觉不到应有的干净

背景: 我正在尝试在DRF中创建一个自定义登录API端点,该端点将由React前端使用。看起来你必须手动强制csrf以DRF格式发送,所以这就是我所做的

我不想发送Django表单,因为它看起来不是RESTful的,但这是我能找到的唯一避免这种情况的方法。请让我知道这是否是干净的代码

序列化程序.py

从rest\u框架导入序列化程序
从django.contrib.auth导入获取用户模型(如果使用自定义用户模型)
UserModel=get\u user\u model()
类UserSerializer(serializers.ModelSerializer):
password=serializers.CharField(write_only=True)
def创建(自我验证的_数据):
user=UserModel.objects.create\u用户(
用户名=已验证的_数据['username'],
密码=已验证的_数据['password'],
电子邮件=已验证的_数据['email'],
)
返回用户
类元:
model=UserModel
#序列化模型字段的元组(请参见链接[2])
字段=(“id”、“用户名”、“电子邮件”、“密码”)
View.py

来自rest\u框架的导入权限
从django.contrib.auth导入获取用户模型(如果使用自定义用户模型)
从rest_framework.views导入APIView
来自rest\u framework.response导入响应
从rest\u框架导入状态
从.serializers导入UserSerializer
从django.utils.decorators导入方法\u decorator
从django.views.decorators.csrf导入确保\u csrf\u cookie、csrf\u protect
类CreateUserView(APIView):
模型=获取用户模型()
权限\u类=[
permissions.AllowAny#或其他用户无法注册
]
serializer\u class=UserSerializer
@方法\u装饰器(确保\u csrf\u cookie)
def get(自我、请求、格式=无):
返回响应(status=status.HTTP\u 200\u OK)
@方法装饰器(csrf保护)
def post(自我、请求、格式=无):
serializer=UserSerializer(data=request.data)
如果序列化程序.u有效():
serializer.create(serializer.validated\u数据)
返回响应(serializer.data,status=status.HTTP\u 201\u已创建)
返回响应(serializer.errors,status=status.HTTP\u 400\u BAD\u请求)

CSRF由Django而不是DRF启用。按照规定,CSRF保护仅在登录时生效

攻击者无需对登录和注册操作进行CSRF保护(因为在CSRF攻击场景中,密码数据是必需的,并且无法猜测)

同样根据Django规范,GET操作/视图不受CSRF保护。但是,GET操作不应更改应用程序的状态。如果情况并非如此,并且您能够在前端实施CSRF保护(这对于REST应用程序是可能的,但对于默认的Django应用程序则不可能),您可以使用decorator手动保护它


这主要不是DRF问题,而是Django问题。

我认为你在大多数事情上都是对的,但是这似乎与你的第二段相矛盾,如果我没有弄错的话,我会理解你第三段所说的(大部分),但我不确定它是如何联系的,如果你能得出类似的结论或提供一个如何在前端进行CSRF的示例,这将非常感谢:)