Django REST Framework JWT认证提示User not found问题求助
Django REST Framework JWT认证:"User not found" 问题排查与解决
问题描述
登录视图可正常验证用户凭据并返回token,但访问受保护视图时,携带Authorization: Bearer <token>请求头后,返回如下错误:
{ "detail": "User not found", "code": "user_not_found" }
核心原因
- 自定义中间件破坏用户实例:你编写的
JWTMiddleware将request.user设置为mongo_id值(字符串/ObjectId),而非Django User实例,导致DRF的IsAuthenticated权限验证无法识别有效用户。 - Token解析字段错误:Simple JWT默认将用户ID存储在
user_idclaim中,而非mongo_id,中间件中错误获取字段导致无法定位用户。 - 中间件干扰官方认证流程:官方
JWTAuthentication已内置完整的token解析与用户绑定逻辑,自定义中间画蛇添足,覆盖了正确的request.user。
解决方案
1. 移除自定义JWTMiddleware
删除该中间件代码,并在settings.py的MIDDLEWARE列表中移除对应配置。DRF Simple JWT的JWTAuthentication会自动处理token解析、用户验证与request.user绑定,无需额外中间件。
2. 修正Simple JWT配置(可选)
若希望token payload中直接用mongo_id作为用户ID的键,可在SIMPLE_JWT配置中添加USER_ID_CLAIM:
SIMPLE_JWT = { 'USER_ID_FIELD': 'mongo_id', 'USER_ID_CLAIM': 'mongo_id', # 让token payload使用mongo_id作为用户ID的键 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60), 'REFRESH_TOKEN_LIFETIME': timedelta(days=1) }
若不添加此配置,默认user_id claim会存储mongo_id的值,官方认证逻辑依然正常工作。
3. 验证自定义User模型配置
确保你的自定义User模型(适配MongoDB)正确设置主键与登录字段:
from djongo import models from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin class UserManager(BaseUserManager): def create_user(self, username, password=None, **extra_fields): if not username: raise ValueError('必须设置用户名') user = self.model(username=username, **extra_fields) user.set_password(password) user.save(using=self._db) return user class User(AbstractBaseUser, PermissionsMixin): mongo_id = models.ObjectIdField(primary_key=True) username = models.CharField(max_length=100, unique=True) # 其他自定义字段... USERNAME_FIELD = 'username' # 指定登录使用的字段 objects = UserManager()
4. 验证Token内容
使用jwt.io工具解码access token,检查payload中的用户ID(user_id或mongo_id)是否与MongoDB中存在的用户记录匹配。
5. 确认官方认证配置正确性
你的REST_FRAMEWORK配置已正确启用JWTAuthentication与IsAuthenticated权限,无需修改:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework_simplejwt.authentication.JWTAuthentication', ], 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ], }
测试验证
移除中间件后,重新通过登录接口获取token,携带该token访问受保护视图,即可正常通过认证。
内容的提问来源于stack exchange,提问作者Luishi
相关产品推荐
相关产品推荐

