Djoser+DRF新用户首次激活接口始终返回stale token错误如何解决?
问题排查方案
最高概率原因:自定义用户创建逻辑错误
Djoser 激活流程要求新注册用户默认 is_active = False,如果你的自定义序列化器 base.serializers.UserSerializer 的 create 方法,或者用户模型字段默认值将 is_active 设为 True,用户注册时就已经激活,后续调用激活接口会直接返回 stale token for the given user 错误。
请优先检查 UserSerializer 代码,确认创建用户时没有手动修改 is_active 字段的默认值。
其他常见排查点
- 参数校验:在前端激活请求发起前打印
uid和token,和邮件激活链接里的对应参数逐字符比对,确认没有被URL转义、截断、多余空格。比如uid是URL安全的Base64编码,如果前端自动解码把+转为空格、把/做路径截断,都会导致参数校验失败。 - 有效期配置校验:Djoser激活token不使用SimpleJWT的有效期配置,它基于Django原生的
PasswordResetTokenGenerator生成,有效期由settings.py的PASSWORD_RESET_TIMEOUT参数控制,默认值为259200秒(3天),如果你手动修改过这个参数设为极小值,也会出现token即时过期的问题。 - 重复激活校验:确认是否触发了多次激活邮件发送,你点击的是最早发送的过期链接,新生成的token会覆盖旧token,导致旧链接直接失效。
- 本地调试:如果以上排查都没有问题,可以在Djoser的
ActivationView的post方法中打断点,确认是uid解析不到对应用户,还是token本身校验不通过,进一步定位根因。
内容的提问来源于stack exchange,提问作者Hasnain Sikander
相关产品推荐
相关产品推荐

