React+Django项目使用JWT令牌关联帖子与登录用户出现未授权错误
问题根因
- 认证类配置不匹配:你在settings.py中全局配置了JWT作为默认认证方式,但视图函数单独指定了
TokenAuthentication(DRF自带的普通令牌认证,和JWT是两套完全不同的认证体系),请求携带的JWT令牌无法被该认证类识别,直接触发未授权错误。 - 补充问题:
parser_classes直接写在函数体内不生效,需要通过装饰器声明才会生效,否则后续上传图片等表单数据会解析失败。
修复方案
步骤1:修正视图认证类和解析器配置
修改views.py代码如下:
# 先导入JWT认证类和解析器装饰器 from rest_framework_simplejwt.authentication import JWTAuthentication from rest_framework.decorators import parser_classes from rest_framework.parsers import MultiPartParser, FormParser @api_view(["POST"]) # 要么直接删掉这行认证类装饰器,用settings的全局配置,要么替换为JWTAuthentication @authentication_classes([JWTAuthentication]) @permission_classes([permissions.IsAuthenticated]) # 解析器要通过装饰器声明才生效 @parser_classes([MultiPartParser, FormParser]) def poultrycreate(request): print(request.user) serializer = PoultryCreateSerializer(data=request.data) if serializer.is_valid(): serializer.save(seller=request.user) return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
步骤2:确认前端请求头格式正确
你在SIMPLE_JWT配置里指定了AUTH_HEADER_TYPES: ('JWT',),所以前端发起请求时必须携带正确格式的请求头:
Authorization: JWT 登录接口返回的access_token值
注意前缀是JWT不是默认的Bearer,前缀和令牌值之间用空格分隔。
验证方式
可以先用接口测试工具(Postman、Apifox等)手动添加上述Authorization头发起请求,确认接口正常返回后再对接前端,排除前端配置问题的干扰。
内容的提问来源于stack exchange,提问作者Amos n
相关产品推荐
相关产品推荐

