From 4e426d6823cf6941b1811fbb9112929e859bc14a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=C3=A9va=20KRIEF?= <32820423+sorasful@users.noreply.github.com> Date: Fri, 14 Apr 2023 16:10:22 +0200 Subject: [PATCH] Add login_return to on_after_login method (#1187) --- docs/configuration/user-manager.md | 1 + fastapi_users/manager.py | 8 ++++++-- fastapi_users/router/auth.py | 2 +- fastapi_users/router/oauth.py | 2 +- tests/test_router_auth.py | 3 +++ 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/docs/configuration/user-manager.md b/docs/configuration/user-manager.md index 1b3fe69b..2410cd02 100644 --- a/docs/configuration/user-manager.md +++ b/docs/configuration/user-manager.md @@ -187,6 +187,7 @@ class UserManager(UUIDIDMixin, BaseUserManager[User, uuid.UUID]): self, user: User, request: Optional[Request] = None, + login_return: Optional[Any] = None, ): print(f"User {user.id} logged in.") ``` diff --git a/fastapi_users/manager.py b/fastapi_users/manager.py index 5210ec4a..3878c13d 100644 --- a/fastapi_users/manager.py +++ b/fastapi_users/manager.py @@ -586,7 +586,10 @@ class BaseUserManager(Generic[models.UP, models.ID]): return # pragma: no cover async def on_after_login( - self, user: models.UP, request: Optional[Request] = None + self, + user: models.UP, + request: Optional[Request] = None, + login_return: Optional[Any] = None, ) -> None: """ Perform logic after user login. @@ -594,7 +597,8 @@ class BaseUserManager(Generic[models.UP, models.ID]): *You should overload this method to add your own logic.* :param user: The user that is logging in - :param request: Optional FastAPI request that + :param request: Optional FastAPI request + :param login_return: Optional return of the login triggered the operation, defaults to None. """ return # pragma: no cover diff --git a/fastapi_users/router/auth.py b/fastapi_users/router/auth.py index 10ce7652..b9587ab0 100644 --- a/fastapi_users/router/auth.py +++ b/fastapi_users/router/auth.py @@ -68,7 +68,7 @@ def get_auth_router( detail=ErrorCode.LOGIN_USER_NOT_VERIFIED, ) login_return = await backend.login(strategy, user, response) - await user_manager.on_after_login(user, request) + await user_manager.on_after_login(user, request, login_return) return login_return logout_responses: OpenAPIResponseType = { diff --git a/fastapi_users/router/oauth.py b/fastapi_users/router/oauth.py index bc51dd27..e6c090db 100644 --- a/fastapi_users/router/oauth.py +++ b/fastapi_users/router/oauth.py @@ -149,7 +149,7 @@ def get_oauth_router( # Authenticate login_return = await backend.login(strategy, user, response) - await user_manager.on_after_login(user, request) + await user_manager.on_after_login(user, request, login_return) return login_return return router diff --git a/tests/test_router_auth.py b/tests/test_router_auth.py index 7d2a042d..4cc65075 100644 --- a/tests/test_router_auth.py +++ b/tests/test_router_auth.py @@ -165,6 +165,9 @@ class TestLogin: "token_type": "bearer", } assert user_manager.on_after_login.called is True + args, kwargs = user_manager.on_after_login.call_args + assert len(args) == 3 + assert all(x is not None for x in args) async def test_inactive_user( self,