如何在Django Rest Framework中缺少Auth Token时返回401

问题描述 投票:2回答:1

无论出于何种原因,当数据库中的标记被删除时,我很难弄清楚如何返回401。

让我解释。

我的常规设置使用SessionAuthentication和TokenAuthentication方案。

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_FILTER_BACKENDS': (
        'rest_framework.filters.DjangoFilterBackend',
    ),
    'DATETIME_FORMAT': '%a, %d %b %Y %H:%M:%S %z',
    'DATETIME_INPUT_FORMATS': ['iso-8601', '%Y-%m-%d %H:%M:%S', '%a, %d %b %Y %H:%M:%S %z'],
    'DATE_FORMAT': '%Y-%m-%d',
    'DATE_INPUT_FORMATS': ['%Y-%m-%d', '%m/%d/%YYYY'],
    'PAGE_SIZE': 20
}

我有一个生成Auth Token的视图,如下所示:

class AcmeObtainAuthToken(APIView):
    throttle_classes = ()
    permission_classes = ()
    parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,)
    renderer_classes = (renderers.JSONRenderer,)
    serializer_class = AcmeAuthTokenSerializer

    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data)
        serializer.context = {'request': self.request}
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        token, created = Token.objects.get_or_create(user=user)
       return Response({'token': token.key,
                     'school': school,
                     'user': user.id})

obtain_auth_token = AcmeObtainAuthToken.as_view()

我的问题是,当存储在db中的令牌由于某种原因而消失并且客户端发送令牌时,我得到403,当我需要401时。

看看docs这真是神秘:

将使用的响应类型取决于身份验证方案。尽管可以使用多种认证方案,但是可以仅使用一种方案来确定响应的类型。在确定响应类型时,将使用视图上设置的第一个身份验证类。

它说它取决于但是如何?没有给出一个例子...有点混淆DRF如何在这里引起它的魔力......

python django rest authentication django-rest-framework
1个回答
2
投票

403是您应该在该实例中获得的响应。看看this link

服务器理解请求,但拒绝履行请求。授权无效,请求不应重复。

实质上,客户端发出了正确的请求但是令牌丢失,因此禁止他的访问(403)。

如果你真的想回复401错误,可以在BloowatchObtainAuthToken视图中尝试以下内容:

class BloowatchObtainAuthToken(ObtainAuthToken):
    def post(self, request, *args, **kwargs):
        response = super(BloowatchObtainAuthToken, self).post(request, *args, **kwargs)
        try:
            token = Token.objects.get(user=request.user) # or what you are validating against
            other stuff here...
        except Token.DoesNotExist:
            return Response({'error': 'Token does not exist'}, status=401)
© www.soinside.com 2019 - 2024. All rights reserved.