Как отправить ответ блокировки 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')