我正在制作一个角度应用程序,使用rest api在django站点进行身份验证 . 在drf的文档中,他们声明拒绝用户身份验证将导致两个错误,HTTP 401和HTTP 403,如下所示:
当未经身份验证的请求被拒绝时,有两个不同的错误代码可能是合适的 . HTTP 401未授权HTTP 403权限被拒绝
无论何时,当我尝试使用某些虚拟数据进行身份验证时,这是错误的,我得到错误响应HTTP 400和 non_field_errors
. 这是什么问题?
首先,我使用用户名和密码进行简单的身份验证,这是为了获取用户令牌,这将是站点中其他操作所需的 .
我正在使用一种方法来获取经验验证令牌,您可以在下面看到它:
class ObtainExperingAuthToken(ObtainAuthToken):def post(self,request,* args,** kargs):serializer = self.serializer_class(data = request.data)
if serializer.is_valid():
print serializer
user = UserProfile.objects.get(email=serializer.data['username'])
token, created = Token.objects.get_or_create(user=user)
utc_now = timezone.now()
if not created and token.created < utc_now - datetime.timedelta(hours=24):
token.delete()
print serializer.data
token = Token.objects.create(user=serializer.data['user'])
token.created = datetime.datetime.utcnow()
token.save()
groups = [group.name for group in user.groups.all()]
response_data = {
'email': user.email,
'token': token.key,
'groups': groups
}
return HttpResponse(json.dumps(response_data), content_type='application/json')
return HttpResponse(serializer.errors, status=400)
@Edit REST_FRAMEWORK
的值
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly',
],
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'accounts.authentication.ExpiringTokenAuthentication',
],
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
'rest_framework.parsers.MultiPartParser',
'rest_framework.parsers.FileUploadParser'
]
}
1 回答
首先,虽然你的解释并不是很清楚,但我猜你在负责提供用户访问令牌的api中遇到400错误 . 因为很明显在这个api上没有身份验证(可能除了客户端身份验证),所以你真的得到了错误的请求错误,因为你提供的是无效的数据,就像你自己提到的那样 . 当您访问不允许未经身份验证的访问的api时,会出现身份验证错误,而实际提供身份验证令牌的API不应该是这种情况 .
其次要获取身份验证错误,您需要将身份验证类添加到
REST_FRAMEWORK['DEFAULT_AUTHENTICATION_CLASSES']
或视图类的AUTHENTICATION_CLASSES
变量 .