我最近在我的Django项目中添加了django-axes。假定用django-restframework框出。但是,我正在使用django-rest-framework-simplejwt处理身份验证。但是它仍然可以解决问题,因为django-axes唯一需要的是将Django的身份验证方法传递给源代码(line 39 and 43)中执行的请求对象。

当我尝试进行身份验证时,我从django-axes收到此错误:


axes.exceptions.AxesBackendRequestParameterRequired:AxesBackend需要请求作为参数进行身份验证

最佳答案

您需要向身份验证功能添加请求。请参见下面的示例代码。

serializers.py

from rest_framework_simplejwt.serializers import TokenObtainPairSerializer

class MyTokenObtainPairSerializer(TokenObtainPairSerializer):

    def _authenticate_user_email(self, email, password, request):

        # This is key: Pass request to the authenticate function
        self.user = authenticate(email=email, password=password, request=request)
        return self.user

    def validate(self, attrs):

        password = attrs.get('password')
        email = attrs.get('email')
        request = self.context.get('request')   # <<=== Grab request

        self.user = self._authenticate_user_email(email, password, request)

        # All error handling should be done by this code line

        refresh = self.get_token(self.user)

        data = {}
        data['refresh'] = str(refresh)
        data['access'] = str(refresh.access_token)

        return data


views.py

from rest_framework_simplejwt.views import TokenObtainPairView
from authy.serializers import MyTokenObtainPairSerializer

class MyTokenObtainPairView(TokenObtainPairView):
    serializer_class = MyTokenObtainPairSerializer


urls.py

from authy.views import MyTokenObtainPairView

url(r'^/auth/api/token/$', MyTokenObtainPairView.as_view(), name='token_obtain_pair'),


还值得一提的是,简单的jwt lib使用了authenticate函数,但是它没有传递request参数。因此,您需要自己调用authenticate,get_token和返回数据对象。

另外,如果您扩展了django的AbstractBaseUser模型。并设置USERNAME_FIELD。然后使用参数用户名代替电子邮件。例如:authenticate(用户名=电子邮件,密码=密码,请求=请求)

10-01 03:36
查看更多