Django REST Framework携带Token调用接口报未提供认证凭证错误
DRF Token认证请求返回“The authentication credentials were not provided”排查与解决
核心排查方向
- 自定义Token登录接口的Token生成逻辑存在缺陷
你项目中自定义了CustomToken视图用于签发Token,如果该视图仅随机生成字符串返回、未将Token与登录用户关联落库到authtoken_token表,DRF的Token校验逻辑会因为数据库中匹配不到对应Token记录,直接判定为未提供有效凭证。 - 视图层依赖导入缺失或错误
你在CreateUser类视图中直接引用了TokenAuthentication、IsAuthenticated,如果视图文件顶部未正确导入这两个类,或者错误导入了其他同名自定义类,会导致实际运行的认证逻辑偏离预期,无法识别请求头中的Token。 - 请求头格式不匹配DRF的解析规则
DRF的TokenAuthentication严格按照固定格式解析认证头:要求Authorization头值以大写Token为标识,后面跟单个空格拼接Token值。如果存在大小写错误、多余空格、全角字符、错误添加Bearer前缀,VS Code REST Client不会自动修正这类格式问题,会直接导致Token识别失败。 - 中间件层的逻辑短路干扰
项目中启用了Django自带的CsrfViewMiddleware,虽然DRF的Token认证本身不依赖CSRF校验,但中间件会在请求进入DRF视图前执行校验逻辑,部分场景下会因为缺失CSRF Cookie直接拦截请求,返回的错误信息会与未认证提示混淆。
对应修复操作
- 补全自定义
CustomToken视图的Token落库逻辑
登录接口完成用户名密码校验后,必须通过DRF自带的Token模型生成与用户绑定的有效Token,禁止自行拼接字符串返回:# 导入Token模型 from rest_framework.authtoken.models import Token # 登录校验通过拿到用户对象后执行 token, _ = Token.objects.get_or_create(user=validated_user) # 返回数据库中真实存在的token值 return Response({"token": token.key}) - 校验数据库中Token的真实有效性
启动Django Shell执行查询语句,确认你拿到的测试Token能匹配到对应用户:
如果执行查询时抛出from rest_framework.authtoken.models import Token # 替换成你的测试Token值 test_token = "b6773c67ecb940ae4fb7c9d49466a01fd46f5eb4" token_obj = Token.objects.get(key=test_token) print(f"Token绑定的用户:{token_obj.user.username}")DoesNotExist异常,说明之前登录接口返回的Token并未真实落库,这就是报错的核心原因。 - 补全
CreateUser视图的依赖导入
在views.py文件顶部补充对应导入语句,避免类属性解析错误:from rest_framework.views import APIView from rest_framework.authentication import TokenAuthentication from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework import status # 引入项目自定义的用户序列化器 from .serializers import UserSerializer - 排除测试工具的格式偏差
用curl命令直接发起请求,验证REST Client插件是否存在请求头格式错误:
如果curl请求能正常通过,说明是REST Client插件的请求头格式存在隐形错误,重新编辑请求配置即可。curl -X POST http://localhost:8000/api/v1/users \ -H "Authorization: Token b6773c67ecb940ae4fb7c9d49466a01fd46f5eb4" \ -H "Content-Type: application/json" \ -d '{"first_name":"Carlos","last_name":"Carlos","username":"carlos","email":"correo@rgrgr.com","password":"contraseña","password2":"contraseña"}'
内容的提问来源于stack exchange,提问作者cosmos multi
相关产品推荐
相关产品推荐

