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

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"
}

核心原因

  1. 自定义中间件破坏用户实例:你编写的JWTMiddleware将request.user设置为mongo_id值(字符串/ObjectId),而非Django User实例,导致DRF的IsAuthenticated权限验证无法识别有效用户。
  2. Token解析字段错误:Simple JWT默认将用户ID存储在user_id claim中,而非mongo_id,中间件中错误获取字段导致无法定位用户。
  3. 中间件干扰官方认证流程:官方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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:02:21