Django DRF自定义用户模型邮箱登录时authenticate返回None
Django DRF 邮箱登录authenticate返回None修复方案
你settings中的AUTH_USER_MODEL和AUTHENTICATION_BACKENDS配置是正确的,不需要调整,认证失败是代码逻辑问题导致,具体原因和修复方式如下:
问题根因
- 直接触发报错的问题:序列化器中给password字段设置了
write_only: True,该字段不会出现在serializer.data的输出结果中,你代码里password = serializer.data.get('password')实际取到的值是None,拿空密码调用认证接口必然返回None。 - 核心逻辑错误:ModelSerializer默认的create方法会直接调用
Model.objects.create()写入数据库,完全绕过了你在CustomUser用户管理器中实现的create_user逻辑,既不会做邮箱归一化处理,也不会调用set_password()对密码做哈希,最终数据库里存的是明文密码。就算你传入了正确的明文密码,authenticate()会将传入密码做哈希后和库中的明文值比对,永远无法匹配成功。 - 潜在拼写错误:Profile模型中邮箱验证字段名写错,
is_varified正确拼写应为is_verified,当前不影响登录流程,但后续开发邮箱校验功能时会触发字段不存在的报错。
分步修复代码
1. 重写序列化器create方法,走正常用户创建逻辑
修改RegisterSerializer,确保创建用户时调用你写好的create_user方法,自动完成密码哈希、邮箱归一化:
from rest_framework import serializers from .models import Profile class RegisterSerializer(serializers.ModelSerializer): class Meta: model = Profile fields = ['email', 'user_name', 'password','phone'] extra_kwargs = { 'password': {'write_only': True} } def create(self, validated_data): # 调用用户管理器的create_user方法,自动处理密码哈希 return Profile.objects.create_user(**validated_data)
2. 修正视图逻辑,去掉多余的authenticate调用
注册成功后serializer.save()会直接返回创建好的合法用户对象,不需要重复调用authenticate做校验,同时修正错误的取值逻辑:
from rest_framework.views import APIView from rest_framework.response import Response from django.contrib.auth import login from .serializers import RegisterSerializer class RegisterView(APIView): def post(self, request): serializer = RegisterSerializer(data=request.data) if serializer.is_valid(): # save返回已完成密码哈希的用户实例 user = serializer.save() # 直接登录即可,无需重复认证 login(request, user) return Response(serializer.data) # 直接返回序列化器的校验错误信息,方便前端排查问题 return Response(serializer.errors, status=400)
3. (可选)修正模型字段拼写
将Profile模型中的is_varified = models.BooleanField(default=False)修改为is_verified = models.BooleanField(default=False),修改完成后执行python manage.py makemigrations和python manage.py migrate同步数据库结构。
验证方法
修复完成后新建测试用户,打开Django admin查看该用户的password字段值,如果是类似pbkdf2_sha256$xxx格式的长哈希字符串,说明密码存储逻辑正常,此时再用邮箱+密码调用登录接口即可正常认证通过。
内容的提问来源于stack exchange,提问作者mr_fahad
相关产品推荐
相关产品推荐

