3

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

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

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

4

2 回答 2

1

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

序列化程序.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

视图.py

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

class MyTokenObtainPairView(TokenObtainPairView):
    serializer_class = MyTokenObtainPairSerializer

网址.py

from authy.views import MyTokenObtainPairView

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

还值得一提的是,简单的 jwt lib 使用了身份验证功能,但是它不传递请求参数。因此,您需要自己调用身份验证、get_token 并返回数据对象。

另外,如果你扩展了 django 的 AbstractBaseUser 模型。并设置USERNAME_FIELD。然后使用参数用户名而不是电子邮件。例如:验证用户名=电子邮件,密码=密码,请求=请求)

于 2019-10-30T03:26:52.297 回答
0

用这个:

from axes.backends import AxesBackend


class MyBackend(AxesBackend)
    def authenticate(self, request=None, *args, **kwargs):
        if request:
            return super().authenticate(request, *args, **kwargs)

如果请求未设置,这将跳过 AUTHENTICATION_BACKENDS 中的 AxesBackend 并且会削弱您的安全设置。

来源:https ://github.com/jazzband/django-axes/issues/478

于 2021-01-28T19:27:40.897 回答