You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 19:54:16