From fde01a00051dcba11e195277302926bffee1215f Mon Sep 17 00:00:00 2001 From: Tochukwu Date: Wed, 21 Aug 2024 17:55:23 +0100 Subject: [PATCH] Fix: Request Missing During Authentication (#89) * fixed authentication with request #88 * revert commented code --- ninja_jwt/controller.py | 16 +++++++++------- ninja_jwt/schema.py | 10 +++++++--- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/ninja_jwt/controller.py b/ninja_jwt/controller.py index d96bf89b0..45be99349 100644 --- a/ninja_jwt/controller.py +++ b/ninja_jwt/controller.py @@ -25,7 +25,7 @@ schema = SchemaControl(api_settings) -class TokenVerificationController(ControllerBase): +class TokenVerificationController: auto_import = False @http_post( @@ -38,7 +38,7 @@ def verify_token(self, token: schema.verify_schema): return token.to_response_schema() -class TokenBlackListController(ControllerBase): +class TokenBlackListController: auto_import = False @http_post( @@ -51,7 +51,7 @@ def blacklist_token(self, refresh: schema.blacklist_schema): return refresh.to_response_schema() -class TokenObtainPairController(ControllerBase): +class TokenObtainPairController: auto_import = False @http_post( @@ -98,7 +98,9 @@ def refresh_token(self, refresh_token: schema.obtain_sliding_refresh_schema): @api_controller("/token", permissions=[AllowAny], tags=["token"], auth=None) -class NinjaJWTDefaultController(TokenVerificationController, TokenObtainPairController): +class NinjaJWTDefaultController( + ControllerBase, TokenVerificationController, TokenObtainPairController +): """NinjaJWT Default controller for obtaining and refreshing tokens""" auto_import = False @@ -106,7 +108,7 @@ class NinjaJWTDefaultController(TokenVerificationController, TokenObtainPairCont @api_controller("/token", permissions=[AllowAny], tags=["token"], auth=None) class NinjaJWTSlidingController( - TokenVerificationController, TokenObtainSlidingController + ControllerBase, TokenVerificationController, TokenObtainSlidingController ): """ NinjaJWT Sliding controller for obtaining and refreshing tokens @@ -186,7 +188,7 @@ async def refresh_token(self, refresh_token: schema.obtain_sliding_refresh_schem @api_controller("/token", permissions=[AllowAny], tags=["token"], auth=None) class AsyncNinjaJWTDefaultController( - AsyncTokenVerificationController, AsyncTokenObtainPairController + ControllerBase, AsyncTokenVerificationController, AsyncTokenObtainPairController ): """NinjaJWT Async Default controller for obtaining and refreshing tokens""" @@ -195,7 +197,7 @@ class AsyncNinjaJWTDefaultController( @api_controller("/token", permissions=[AllowAny], tags=["token"], auth=None) class AsyncNinjaJWTSlidingController( - AsyncTokenVerificationController, AsyncTokenObtainSlidingController + ControllerBase, AsyncTokenVerificationController, AsyncTokenObtainSlidingController ): """ NinjaJWT Async Sliding controller for obtaining and refreshing tokens diff --git a/ninja_jwt/schema.py b/ninja_jwt/schema.py index 8e68f3d9a..341250f48 100644 --- a/ninja_jwt/schema.py +++ b/ninja_jwt/schema.py @@ -5,6 +5,7 @@ from django.conf import settings from django.contrib.auth import authenticate, get_user_model from django.contrib.auth.models import AbstractUser, update_last_login +from django.http import HttpRequest from django.utils.translation import gettext_lazy as _ from ninja import ModelSchema, Schema from ninja.schema import DjangoGetter @@ -52,7 +53,7 @@ def check_user_authentication_rule(self) -> None: ) @classmethod - def validate_values(cls, values: Dict) -> Dict: + def validate_values(cls, request: HttpRequest, values: Dict) -> Dict: if user_name_field not in values and "password" not in values: raise exceptions.ValidationError( { @@ -69,7 +70,7 @@ def validate_values(cls, values: Dict) -> Dict: if not values.get("password"): raise exceptions.ValidationError({"password": "password is required"}) - _user = authenticate(**values) + _user = authenticate(request, **values) cls._user = _user if not (_user is not None and _user.is_active): @@ -103,8 +104,11 @@ class Config: @model_validator(mode="before") def validate_inputs(cls, values: DjangoGetter) -> DjangoGetter: input_values = values._obj + request = values._context.get("request") if isinstance(input_values, dict): - values._obj.update(cls.validate_values(input_values)) + values._obj.update( + cls.validate_values(request=request, values=input_values) + ) return values return values