Django REST Framework用户Token认证失败问题求助
问题解决:Token认证返回"Authentication credentials were not provided"但request.user正确
核心问题分析
你遇到的矛盾点(能拿到request.user但request.auth为None)说明当前请求的用户身份是通过Session认证而非Token认证填充的,DRF的TokenAuthentication并未真正生效,所以才会返回凭证未提供的错误。
解决方案步骤
1. 修正Postman的Token传递方式
DRF的TokenAuthentication要求请求头格式必须为:
Authorization: Token <你的Token字符串>
你之前把Key设为"Token"、Value设为Token值的方式是错误的。正确操作:
- 打开Postman的「Authorization」选项卡
- 类型选择「API Key」,然后填写:
- Key:
Authorization - Value:
Token 你的实际Token字符串 - 选择「Header」位置
或者直接在「Headers」标签页手动添加上述键值对。
- Key:
2. 强制视图仅使用Token认证
如果系统同时支持Session和Token认证,DRF会按配置顺序优先使用Session认证(比如请求携带了浏览器Cookie)。可以在视图里指定仅启用Token认证,避免干扰:
class ReceiveMessagesView(viewsets.ModelViewSet): serializer_class = MessageSerializer permission_classes = [permissions.IsAuthenticated] authentication_classes = [TokenAuthentication] # 新增该行,指定仅用Token认证 http_method_names = ['get', 'post'] def get_queryset(self): user = self.request.user queryset = Message.objects.filter(receiver=user) return queryset
3. 验证Token的有效性
检查数据库中的authtoken_token表(如果使用rest_framework.authtoken应用),确认:
- 目标用户对应的Token记录存在
- Postman中使用的Token字符串和数据库里的完全一致(注意大小写、无多余空格)
4. 排除中间件干扰
检查项目的MIDDLEWARE配置,确保没有自定义中间件修改或丢弃了Authorization请求头,导致DRF无法读取Token。
内容的提问来源于stack exchange,提问作者BoazBitt
相关产品推荐
相关产品推荐

