Django中BasicAuthentication的流程

时间:2014-10-30 07:08:09

标签: django django-rest-framework django-authentication

我的Django REST API有这个类用于身份验证:

class AuthView(APIView):
      authentication_classes = (BasicAuthentication,)

      def post(self, request, *args, **kwargs):
          login(request, request.user)
          data = {'testkey':'testvalue'}
          return HttpResponse(json.dumps(data), content_type="application/json")

当凭证正确时,控制将发布方法(这很好)。 但是,对于不正确的凭据,有人可以解释为什么控制没有进入post方法吗?

我想为未经身份验证的请求设置一个自定义HTTP状态代码,(不能在帖子内执行此操作,因为对于未经身份验证的请求,控件不在那里)并且我正在寻找一种正确的方法来执行此操作。

3 个答案:

答案 0 :(得分:1)

Control永远不会输入您的POST方法,因为Django Rest Framework(您在此处使用)将首先使用您指定的authentication_classes对传入的请求进行身份验证,然后再输入post方法(或{{ 1}}等等 - 取决于请求。)

您在此处使用的getthrows an exception when credentials are incorrect(这是Django Rest Framework的工作方式,documented here)。

这会停止执行流程(因此它永远不会到达您的方法),并提前返回错误代码。


现在,实现此功能的实际代码位于APIView.dispatch中,在发出请求时会调用它。 BasicAuthentication调用是最终调用身份验证代码的调用,而调用self.initial()方法的调用是post行(稍后会发生,如您所见)。< / p>


为了回答你问题的第二部分,Django Rest Framework非常注重应该如何完成事情,但你可以通过定义自己的身份验证类来自定义状态代码,但我对此表示怀疑。

答案 1 :(得分:0)

最后,我扩展了BasicAuthentication并覆盖了authenticate_credentials方法,如下所示:

from rest_framework.authentication import BasicAuthentication
from django.contrib.auth import authenticate

class CustomAuth(BasicAuthentication):

    def authenticate_credentials(self, userid, password):
        """
        Override authenticate_credentials(..) of BasicAuthentication
        """
        user = authenticate(username=userid, password=password)
        '''if user is None or not user.is_active:
            raise exceptions.AuthenticationFailed('Invalid username/password')'''
        return (user, None)

现在似乎工作正常。 但是,我不确定这是否是最好的方法!

答案 2 :(得分:-1)

基本身份验证通常由浏览器实现。如果身份验证通过,我希望他们只提交帖子。

http://tools.ietf.org/html/rfc1945#section-11.1