Django中JWT认证AccessToken无法通过验证的问题排查
Django JWT认证异常:Token验证通过但Profile接口返回用户未找到
问题现象
在Django项目中用JWT做用户认证,出现以下异常:
- 登录接口调用正常,Postman能拿到包含
refresh和accesstoken的响应,用jwt.io验证accesstoken里的user_id完全正确 - 把
accesstoken放进Bearer请求头访问Profile视图时,一直返回{"detail": "User not found", "code": "user_not_found"},没法通过认证拿到200响应 - 已经配置过settings.py里的JWT相关项
相关代码
登录视图
# 用户登录 class UserLoginView(APIView): def post(self, req): serializer = UserLoginSerializer(data=req.data) if serializer.is_valid(raise_exception=True): user = serializer.validated_data['user'] return Response({ "message": "Login successful", "user_id": user.id, "username": user.username, "tokens": get_tokens_for_user(user) }, status=HTTP_200_OK) return Response( {"message": "Login failed"}, status=HTTP_400_BAD_REQUEST )
用户Profile视图
# 用户信息视图 class UserProfileView(APIView): permission_classes = [IsAuthenticated] def get(self, req): print(f"Request user: {req.user}") print(f"User authenticated: {req.user.is_authenticated}") if req.user.is_authenticated: user = req.user serializer = UserProfileSerializer(user) return Response(serializer.data, status=HTTP_200_OK) return Response({"message": "Unauthorized"}, status=HTTP_401_UNAUTHORIZED)
排查与解决步骤
- 检查JWT认证后端的用户查询逻辑:如果用了自定义用户模型,确认
settings.py里的JWT_AUTH_USER_MODEL指向正确;排查JWT认证后端的get_user方法,确保从token解析出user_id后,能通过User.objects.get(id=user_id)找到用户,注意用户是否被软删除(比如is_active=False) - 核对Token生成与解析的字段一致性:查看
get_tokens_for_user函数的实现,确认生成token时payload里的用户ID键名(默认是user_id)和认证后端解析时用的键名一致,别出现生成时用id但解析时查user_id的情况 - 确认请求头格式正确:Postman里的请求头必须是
Authorization,值为Bearer <你的access token>,注意Bearer和token之间要有一个空格,别加多余的引号或空格 - 检查用户模型的认证属性:如果是自定义用户模型,必须继承
AbstractBaseUser和PermissionsMixin,确保is_authenticated属性能正常返回正确状态 - 查看Django调试日志:开启Django调试模式,看后台日志里的认证报错详情,通常能直接定位到用户查询失败的具体原因,比如用户ID不存在、数据库查询异常等
内容的提问来源于stack exchange,提问作者Animesh Singh
相关产品推荐
相关产品推荐

