Django Token认证返回“Authentication credentials were not provided”问题求助
Django REST Token认证失败问题解决方法
你遇到的核心问题是Django REST框架默认的TokenAuthentication不识别Bearer格式的认证头,导致请求无法通过认证,request.user被设为匿名用户,进而触发后续错误。以下是具体解决方法:
方法1:使用Token认证头格式(最快解决)
Django REST的TokenAuthentication默认只接受Token <你的token值>这种格式的Authorization头,而非Bearer。在Postman中调整如下:
- 打开Authorization选项卡
- 认证类型选择Token(不是Bearer Token)
- 在Token输入框中填入你的token(比如
xxyyzz)
或者手动设置请求头:
Authorization: Token xxyyzz
方法2:自定义认证类支持Bearer格式
如果一定要用Bearer前缀,可自定义认证类兼容该格式:
# 在你的app中新建authentication.py,或直接写在views.py内 from rest_framework.authentication import TokenAuthentication class BearerTokenAuthentication(TokenAuthentication): # 将默认的认证标识从'Token'改为'Bearer' keyword = 'Bearer'
然后修改视图的认证类配置:
class EventGetCreate(APIView): # 替换为自定义的认证类 authentication_classes = (BearerTokenAuthentication,) permission_classes = (IsAuthenticated,) def get(self, request): created_user = request.user events = Event.objects.filter(creator=created_user) serializer = EventSummary(events, many=True) return Response(serializer.data)
额外检查项
- 确认
Token模型已正确生成:运行过python manage.py migrate(rest_framework.authtoken会自动创建Token数据表) - 确保获取token时使用的用户,与请求事件列表的用户一致,避免token和用户不匹配
- 若想让所有视图默认支持Token认证,可在
settings.py中全局配置:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.TokenAuthentication', # 或你自定义的BearerTokenAuthentication ], }
错误原因说明
当你用Bearer头请求时,默认的TokenAuthentication无法识别该认证方式,不会将request.user设置为登录用户,导致:
- 开启
IsAuthenticated权限时,直接返回"Authentication credentials were not provided" - 关闭权限后,
request.user是AnonymousUser,用它过滤Event表的creator字段(需要用户ID),就会触发"Field 'id' expected a number but got AnonymousUser"的类型错误
内容的提问来源于stack exchange,提问作者Nht_e0
相关产品推荐
相关产品推荐

