jazzband / django-axes

Keep track of failed login attempts in Django-powered sites.
MIT License
1.49k stars 346 forks source link

Django Ninja JWT Integration #984

Open jonnyhoff opened 1 year ago

jonnyhoff commented 1 year ago

Django Axes works great when logging in normally but I've implemented Django Ninja JWT and when making REST API requests using the default Django Ninja JWT controller api.register_controllers(NinjaJWTDefaultController), I get the below error.

It's obvious that the authentication method needs to include the request as an argument but I'm unable to find where in Django Ninja JWT's code this needs to be done.

"POST - AsyncNinjaJWTSlidingController[obtain_token] /api/token/pair" ()
Unprocessable Entity: /api/token/pair
Error: 422 - {'detail': [{'loc': ['body', 'user_token', '__root__'], 'msg': 'AxesBackend requires a request as an argument to authenticate', 'type': 'value_error.axesbackendrequestparameterrequired'}]}
chemsedd commented 5 months ago

Hello, I'm facing the exact same issue, I guess no fix has been submitted yet!

robertvy commented 1 month ago

What worked for me is to create a custom authentication backend:

from axes.backends import AxesBackend

class CustomAxesBackend(AxesBackend):
    def authenticate(self, request=None, username=None, password=None, **kwargs):
        if request is None:
            # Create a minimal request object if it's not provided
            class MinimalRequest:
                META = {'REMOTE_ADDR': 'unknown'}
            request = MinimalRequest()

        # Call the original authenticate method
        return super().authenticate(request, username, password, **kwargs)

This approach should help bypass the issue where the AxesBackend requires a request object, allowing your Django Ninja JWT integration to function correctly.

eadwinCode commented 1 month ago

This has been resolved in django-ninja-jwt new release v5.3.3