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

Django自定义用户模型JWT认证无法生成Token问题求助

问题解决:API创建用户时密码未哈希导致JWT认证失败

问题出在你的UserCreationSerializer没有调用自定义UserManager的create_user方法,直接保存模型实例时不会自动处理密码哈希。终端创建超级用户时用的是createsuperuser命令,它会调用管理器的方法,所以密码被正确哈希了。

解决方案:重写序列化器的create方法

修改你的UserCreationSerializer,确保在创建用户时调用User.objects.create_user(),而不是默认的模型保存逻辑:

from rest_framework import serializers
from .models import User

class UserCreationSerializer(serializers.ModelSerializer):
    # 把password设为write_only,避免返回明文密码
    password = serializers.CharField(write_only=True)

    class Meta:
        model = User
        fields = ['email', 'username', 'phone_number', 'password']

    def create(self, validated_data):
        # 调用自定义管理器的create_user方法,自动处理密码哈希
        return User.objects.create_user(**validated_data)

为什么原来的代码不生效?

默认的ModelSerializer.create()方法会直接执行User.objects.create(**validated_data),这不会触发你自定义管理器里的create_user逻辑,也就不会调用set_password()对密码进行哈希处理。数据库里存的是明文密码,而JWT认证时会尝试将用户输入的密码哈希后与数据库中的值比对,自然匹配失败,返回"No active account found with the given credentials"。

额外检查项

  • 确认UserCreationSerializer中password字段设置了write_only=True,防止接口返回明文密码
  • 查看数据库中用户的password字段,正常哈希后的密码应该以pbkdf2_sha256$或类似前缀开头
  • 如果你使用Djoser,其实可以直接用它提供的/users/注册端点,无需自己编写APIView,Djoser的序列化器已经内置了密码哈希逻辑

内容的提问来源于stack exchange,提问作者Yussef Raouf Abdelmisih

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:30:47