DRF API端点Basic Authentication报错“Authentication credentials were not provided”求助
排查DRF中Basic Authentication无法生效的问题
我来帮你一步步排查这个问题,从最常见的原因开始梳理:
1. 先确认Postman的请求配置是否正确
Postman的Basic Auth功能需要正确生成Authorization请求头。你可以按以下步骤检查:
- 在Postman的"Authorization"标签页选择"Basic Auth",输入正确的用户名和密码,点击"Update Request"。
- 切换到"Headers"标签页,确认存在
Authorization头,格式为Basic [base64编码的字符串](比如Basic dXNlcjE6cGFzc3dvcmQ=)。 - 如果手动修改过Headers,可能会覆盖自动生成的内容,这时候要确保没有误删或修改这个头。
2. 检查DRF认证类的配置优先级
你的全局认证类配置中,BasicAuthentication排在最后。虽然DRF会按顺序尝试所有认证类,但有时候前面的认证类(比如SessionAuthentication)可能会先捕获请求,导致BasicAuth没有被触发。可以尝试调整顺序,把BasicAuthentication放在最前面,看看是否生效:
REST_FRAMEWORK['DEFAULT_AUTHENTICATION_CLASSES'] = ( 'rest_framework.authentication.BasicAuthentication', 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.TokenAuthentication', )
3. 验证用户密码是否正确加密
DRF的BasicAuthentication依赖于Django用户模型的密码加密机制。如果你的用户密码是明文存储的,验证会直接失败。你可以:
- 进入Django后台,查看对应用户的
password字段,确认开头是pbkdf2_sha256$之类的加密前缀(而不是明文)。 - 如果是新创建的用户,确保使用
User.objects.create_user()而不是直接User.objects.create(),前者会自动加密密码。
4. 在视图中显式指定认证类
有时候全局配置可能被其他地方覆盖,你可以在视图中强制指定BasicAuthentication,排除全局配置的干扰:
from rest_framework.authentication import BasicAuthentication class ReportsDashboardView(views.APIView): permission_classes = (IsAuthenticated, IsActiveUser,) authentication_classes = (BasicAuthentication,) # 显式指定认证类 def get(self, request, format=None): # 你的业务逻辑 ...
5. 检查请求头是否被中间件/服务器拦截
有些Web服务器(比如Nginx)或自定义中间件会默认移除Authorization头,导致DRF无法获取认证凭证。你可以在视图中打印请求头,确认是否接收到:
def get(self, request, format=None): print("Authorization Header:", request.META.get('HTTP_AUTHORIZATION')) # 你的业务逻辑 ...
如果打印结果是None,说明请求头没有到达DRF,这时候需要检查服务器配置或中间件是否修改了请求头。
6. 排除权限类的干扰
虽然错误信息指向认证问题,但可以暂时简化权限配置,只保留IsAuthenticated,看看是否是IsActiveUser权限类的逻辑导致的误判:
class ReportsDashboardView(views.APIView): permission_classes = (IsAuthenticated,) # 其他配置不变
按这个顺序排查,应该能找到问题所在。
内容的提问来源于stack exchange,提问作者Snipper03
相关产品推荐
相关产品推荐

