使用Django JWT认证时出现“无有效账户”错误求助
问题排查与修复
核心错误:CustomUserManager的create_user方法存在致命问题
你的CustomUserManager.create_user方法里有两个直接导致JWT验证失败的严重问题:
- 无限递归调用:方法内使用
CustomUser.objects.create_user(email=email, password=password)创建用户,这会不断触发自身调用,最终导致栈溢出,用户创建逻辑根本无法正确执行。 - 硬编码覆盖密码:你强制调用
user.set_password('nouveau_mot_de_passe'),这会完全忽略传入的password参数,把所有用户的密码固定成这个字符串——哪怕你认为数据库里的凭证正确,实际验证时也匹配不上你输入的密码。
修正后的CustomUserManager代码
替换原models文件中的CustomUserManager类:
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin from django.db import models # 补充遗漏的导入 class CustomUserManager(BaseUserManager): def create_user(self, email, password=None, **extra_fields): if not email: raise ValueError("L'adresse email doit être définie.") email = self.normalize_email(email) # 使用self.model创建实例,避免递归调用 user = self.model(email=email, **extra_fields) # 仅当传入密码时才设置,保留原生逻辑 if password: user.set_password(password) user.save(using=self._db) return user def create_superuser(self, email, password=None, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) extra_fields.setdefault('is_active', True) if extra_fields.get('is_staff') is not True: raise ValueError('Superuser must have is_staff=True.') if extra_fields.get('is_superuser') is not True: raise ValueError('Superuser must have is_superuser=True.') return self.create_user(email, password, **extra_fields)
额外必要操作
- 重新创建测试用户:由于之前的create_user方法逻辑错误,数据库中现存用户的密码大概率是无效的,修正代码后需要重新创建测试用户,或手动修改现有用户的密码为正确值。
- 验证Postman请求格式:确保向JWT默认端点
/api/token/发起POST请求,参数需符合要求:- 表单数据:
username填用户邮箱,password填正确密码; - JSON格式:
{"username": "user@example.com", "password": "yourpassword"}。
- 表单数据:
- 确认用户激活状态:检查数据库中测试用户的
is_active字段是否为True(你的模型默认是True,但如果手动修改过需确认)。
内容的提问来源于stack exchange,提问作者Cephas BERE
相关产品推荐
相关产品推荐

