Как отправить ответ блокировки django-axes в ответе login api

Приложение django (django-rest-framework) использует Simple JWT для аутентификации, и теперь я пытаюсь интегрировать django-axes во фреймворк.

Я могу заблокировать пользователя при 5 неудачных попытках входа в систему, и это работает как ожидалось. Все работает нормально, но когда пользователь заблокирован, я не могу отправить ответ пользователю, уведомляющий его о том, что он заблокирован.

Заявление о проблеме :

Когда пользователь входит в систему, он получает No active account found with the given credentials при неудачной попытке. Но как только он достигает предела блокировки, он получает Account locked for 1 hours: too many login attempts.

Простая конфигурация JWT:

class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
def validate(self, attrs):
    print("Yes.........")
    data = super().validate(attrs)

    data['username'] = self.user.username
    data['id'] = self.user.id
    data['first_name'] = self.user.first_name
    data['last_name'] = self.user.last_name
    data['phone'] = self.user.phone
    data['email'] = self.user.email

    test = update_last_login(None, self.user)
        
    return data

MyTokenObtainPairView

class MyTokenObtainPairView(TokenObtainPairView):
serializer_class = MyTokenObtainPairSerializer

def send_response(self):
    return Response(self.serializer_class.data, status=status.HTTP_200_OK)

Я предполагаю, что нам нужно переопределить эту функцию validate. Но сделать это не удалось. Я также пытался использовать: from axes.signals import user_locked_out

class TokenObtainSerializer(serializers.Serializer):
username_field = User.USERNAME_FIELD

default_error_messages = {
    'no_active_account': _('No active account found with the given credentials')
}

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)

    self.fields[self.username_field] = serializers.CharField()
    self.fields['password'] = PasswordField()

def validate(self, attrs):
    authenticate_kwargs = {
        self.username_field: attrs[self.username_field],
        'password': attrs['password'],
    }
    try:
        authenticate_kwargs['request'] = self.context['request']
    except KeyError:
        pass

    self.user = authenticate(**authenticate_kwargs)

    # Prior to Django 1.10, inactive users could be authenticated with the
    # default `ModelBackend`.  As of Django 1.10, the `ModelBackend`
    # prevents inactive users from authenticating.  App designers can still
    # allow inactive users to authenticate by opting for the new
    # `AllowAllUsersModelBackend`.  However, we explicitly prevent inactive
    # users from authenticating to enforce a reasonable policy and provide
    # sensible backwards compatibility with older Django versions.
    if self.user is None or not self.user.is_active:
        raise exceptions.AuthenticationFailed(
            self.error_messages['no_active_account'],
            'no_active_account',
        )

    return {}

@classmethod
def get_token(cls, user):
    raise NotImplementedError('Must implement `get_token` method for `TokenObtainSerializer` subclasses')
Вернуться на верх