使用Django DRF与Simple JWT获取当前用户时认证报错如何处理?
问题根因
- JWT认证失败是因为你传递token的方式不符合Simple JWT的默认要求:
DRF的JWTAuthentication默认只会从请求头里读取认证信息,要求格式为Authorization: Bearer <你获取的access_token>,你当前是把token放在URL参数里传递,认证类识别不到,所以抛出凭证未提供的报错。 - 你移除认证、权限配置的做法完全错误,存在极高安全风险:
- 接口完全失去访问控制,任何人不需要登录就可以直接调用,拉取你所有用户的全量数据,用户隐私完全泄露
- 你当前视图绑定的是ModelViewSet的
list方法,本身返回的是User表的全量用户数据,你测试时误以为返回的是当前用户,只是因为你测试环境只有1个用户而已,生产环境会直接暴露所有用户信息
正确实现方案
- 首先恢复你删掉的两行认证、权限配置,这两行是用户身份校验的核心,绝对不能删除。
- 调整Postman请求配置:先调用Simple JWT的token获取接口拿到有效access_token,在请求头中添加字段
Authorization: Bearer <你的access_token>,不要把token放在URL参数中(URL参数会被服务器日志、代理等记录,本身也不符合安全规范)。 - 调整视图和路由逻辑,不要用list接口返回当前用户,单独实现专属的当前用户查询接口,示例代码如下:
视图代码
from rest_framework import viewsets, status from rest_framework.decorators import action from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated from rest_framework_simplejwt.authentication import JWTAuthentication from .serializers import UserSerializer class UserViewSet(viewsets.GenericViewSet): serializer_class = UserSerializer authentication_classes = [JWTAuthentication] permission_classes = [IsAuthenticated] @action(methods=['get'], detail=False, url_path='current') def get_current_user(self, request): # 经过JWT认证后,request.user就是当前登录的用户对象,无需全量查询User表 serializer = self.get_serializer(request.user) return Response(serializer.data, status=status.HTTP_200_OK)
路由代码
path('user/current/', UserViewSet.as_view({'get': 'get_current_user'}), name="current-user"),
调整后接口只会返回当前登录用户的个人信息,且只有携带有效JWT token的请求才能访问,完全符合安全要求。
内容的提问来源于stack exchange,提问作者rediet yosef
相关产品推荐
相关产品推荐

