首页 文章

Django Rest Framework身份验证错误

提问于
浏览
0

我正在制作一个角度应用程序,使用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 回答

  • 1

    首先,虽然你的解释并不是很清楚,但我猜你在负责提供用户访问令牌的api中遇到400错误 . 因为很明显在这个api上没有身份验证(可能除了客户端身份验证),所以你真的得到了错误的请求错误,因为你提供的是无效的数据,就像你自己提到的那样 . 当您访问不允许未经身份验证的访问的api时,会出现身份验证错误,而实际提供身份验证令牌的API不应该是这种情况 .

    其次要获取身份验证错误,您需要将身份验证类添加到 REST_FRAMEWORK['DEFAULT_AUTHENTICATION_CLASSES'] 或视图类的 AUTHENTICATION_CLASSES 变量 .

相关问题