Django REST Framework配置Token认证后仍提示未提供认证凭证
Token认证返回"Authentication credentials were not provided"排查清单
- 请求头格式不符合要求(最高发原因)
DRF内置的TokenAuthentication对认证头格式有严格校验,不符合规则的请求会直接被判定为未携带凭证:- 固定请求头键名为
Authorization,值的格式必须是Token <具体Token字符串>,也就是前缀Token和后面的Token内容之间必须有一个半角空格,正确示例:Authorization: Token 401f7ac0459ea43195a498bd3eeb21c2331d29db - 常见错误:把JWT的
Bearer格式套用到Token认证流程、漏写Token前缀、前缀和Token值之间漏加空格、把前缀Token错写为全小写token、测试工具里错把请求头键名写成authentication。
- 固定请求头键名为
- 视图代码存在语法疏漏
你贴出的测试视图中,permission_classes = (IsAuthenticated)行存在Python语法问题:单元素元组必须在元素后加末尾逗号,否则这行代码实际赋值的是IsAuthenticated类本身,而非包含该类的元组,不符合DRF对权限类配置的可迭代要求。正确写法为permission_classes = (IsAuthenticated,)。这个问题本身会触发权限类迭代错误,虽然和当前遇到的报错不直接相关,但需要修正避免后续流程出错。 - 全局认证配置未实际生效
- 确认已经执行过数据库迁移命令,为
rest_framework.authtoken创建对应的auth_token表,未完成迁移的话哪怕Token生成命令执行成功,数据库也没有对应的Token记录,会导致认证校验失败。 - 检查项目多环境配置、应用级settings覆盖逻辑,确认你编写的
REST_FRAMEWORK全局配置没有被后续配置项覆盖为空列表,导致DRF没有加载Token认证的解析逻辑。
- 确认已经执行过数据库迁移命令,为
- Token关联关系不匹配
执行python manage.py drf_create_token test1生成Token时,必须确认命令中的test1和系统内实际存在的用户名完全匹配(注意大小写、特殊字符差异)。生成Token后可以通过Shell命令核验:
如果查询不到对应Token,或者关联用户和预期不符,说明Token生成环节就存在问题。# 执行python manage.py shell后运行以下代码 from rest_framework.authtoken.models import Token # 打印所有已生成Token及关联用户 for token in Token.objects.all(): print(f"Token值:{token.key}, 关联用户:{token.user.username}") - 网络层拦截了认证头
如果服务部署在Nginx、API网关等反向代理后方,需要确认代理配置没有过滤Authorization请求头,未做对应头信息转发的话,后端服务根本接收不到前端传递的认证字段,会持续判定为未提供认证凭证。
内容的提问来源于stack exchange,提问作者Shend Tytynxhiu
相关产品推荐
相关产品推荐

