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
相关产品推荐
相关产品推荐

