使用Django REST Framework开发API遇认证凭证未提供错误求助
解决DRF中"Authentication credentials were not provided"错误
核心问题:认证机制不匹配
你使用rest_framework_simplejwt生成JWT令牌,但配置和视图中用的是DRF自带的TokenAuthentication,两类认证体系不兼容,导致令牌无法被识别。
1. 修正全局认证类配置
将settings.py中的DEFAULT_AUTHENTICATION_CLASSES替换为simplejwt的JWT认证类:
REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES': [ 'rest_framework.renderers.JSONRenderer', 'rest_framework.renderers.BrowsableAPIRenderer', ], 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework_simplejwt.authentication.JWTAuthentication', # 替换为JWT认证类 ], 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ] }
2. 修正视图的认证装饰器
视图中也要同步替换认证类,确保和全局配置一致:
from rest_framework_simplejwt.authentication import JWTAuthentication # 导入正确的认证类 @api_view(['GET']) @authentication_classes([JWTAuthentication]) @permission_classes([IsAuthenticated]) def get_all_messages(request, user_id): messages = Message.objects.filter(receiver_id=user_id) serializer = MessageSerializer(messages, many=True) return Response(serializer.data)
3. 确认请求时的Token携带格式
获取到JWT的access令牌后,必须在请求头中按以下格式携带:
Authorization: Bearer <你的access令牌>
注意Bearer和令牌之间必须有一个空格,不能省略。
4. 额外检查项
- 确保使用的是
access令牌,refresh令牌仅用于刷新access令牌,不能直接用于接口认证 - 检查令牌是否过期:simplejwt默认
access令牌有效期为5分钟,过期需重新获取或用refresh令牌刷新
内容的提问来源于stack exchange,提问作者Gal
相关产品推荐
相关产品推荐

