← Back to team overview

sts-sponsors team mailing list archive

[Merge] ~ack/maas-site-manager:auth-form-json into maas-site-manager:main

 

Alberto Donato has proposed merging ~ack/maas-site-manager:auth-form-json into maas-site-manager:main.

Commit message:
change the /login url to accept json instead of form data


Requested reviews:
  MAAS Lander (maas-lander): unittests
  MAAS Committers (maas-committers)

For more details, see:
https://code.launchpad.net/~ack/maas-site-manager/+git/site-manager/+merge/441748
-- 
Your team MAAS Committers is requested to review the proposed merge of ~ack/maas-site-manager:auth-form-json into maas-site-manager:main.
diff --git a/backend/msm/schema/__init__.py b/backend/msm/schema/__init__.py
index 5c626ef..21e6316 100644
--- a/backend/msm/schema/__init__.py
+++ b/backend/msm/schema/__init__.py
@@ -10,6 +10,7 @@ from ._models import (
     Site,
     Token,
     User,
+    UserLoginRequest,
     UserWithPassword,
 )
 from ._pagination import (
@@ -22,16 +23,17 @@ from ._pagination import (
 __all__ = [
     "CreateTokensRequest",
     "CreateTokensResponse",
-    "Site",
-    "Token",
-    "pagination_params",
-    "PaginationParams",
+    "JSONWebToken",
+    "JSONWebTokenData",
+    "MAX_PAGE_SIZE",
     "PaginatedResults",
     "PaginatedSites",
     "PaginatedTokens",
-    "MAX_PAGE_SIZE",
-    "UserWithPassword",
+    "PaginationParams",
+    "Site",
+    "Token",
     "User",
-    "JSONWebToken",
-    "JSONWebTokenData",
+    "UserLoginRequest",
+    "UserWithPassword",
+    "pagination_params",
 ]
diff --git a/backend/msm/schema/_models.py b/backend/msm/schema/_models.py
index 86529b6..a62e3e6 100644
--- a/backend/msm/schema/_models.py
+++ b/backend/msm/schema/_models.py
@@ -46,6 +46,13 @@ class User(ReadUser):
     id: int
 
 
+class UserLoginRequest(BaseModel):
+    """User login details."""
+
+    username: str
+    password: str
+
+
 class CreateSite(BaseModel):
     """
     A MAAS installation
diff --git a/backend/msm/user_api/_base.py b/backend/msm/user_api/_base.py
index 06ba0e4..48fb1b0 100644
--- a/backend/msm/user_api/_base.py
+++ b/backend/msm/user_api/_base.py
@@ -6,7 +6,6 @@ from fastapi import (
     HTTPException,
     status,
 )
-from fastapi.security import OAuth2PasswordRequestForm
 from sqlalchemy.ext.asyncio import AsyncSession
 
 from .. import __version__
@@ -23,6 +22,7 @@ from ..schema import (
     pagination_params,
     PaginationParams,
     User,
+    UserLoginRequest,
 )
 from ..settings import SETTINGS
 from ._forms import (
@@ -42,7 +42,7 @@ async def root() -> dict[str, str]:
 
 
 async def sites(
-    current_user: Annotated[User, Depends(get_authenticated_user)],
+    authenticated_user: Annotated[User, Depends(get_authenticated_user)],
     session: AsyncSession = Depends(db_session),
     pagination_params: PaginationParams = Depends(pagination_params),
     filter_params: SiteFilterParams = Depends(site_filter_parameters),
@@ -63,7 +63,7 @@ async def sites(
 
 
 async def tokens(
-    current_user: Annotated[User, Depends(get_authenticated_user)],
+    authenticated_user: Annotated[User, Depends(get_authenticated_user)],
     session: AsyncSession = Depends(db_session),
     pagination_params: PaginationParams = Depends(pagination_params),
 ) -> PaginatedTokens:
@@ -80,7 +80,7 @@ async def tokens(
 
 
 async def tokens_post(
-    current_user: Annotated[User, Depends(get_authenticated_user)],
+    authenticated_user: Annotated[User, Depends(get_authenticated_user)],
     create_request: CreateTokensRequest,
     session: AsyncSession = Depends(db_session),
 ) -> CreateTokensResponse:
@@ -97,11 +97,11 @@ async def tokens_post(
 
 
 async def login_for_access_token(
-    form_data: Annotated[OAuth2PasswordRequestForm, Depends()],
+    user_login: UserLoginRequest,
     session: AsyncSession = Depends(db_session),
 ) -> JSONWebToken:
     user = await authenticate_user(
-        session, form_data.username, form_data.password
+        session, user_login.username, user_login.password
     )
     if not user:
         raise HTTPException(
@@ -119,7 +119,7 @@ async def login_for_access_token(
 
 
 async def read_users_me(
-    current_user: Annotated[User, Depends(get_authenticated_user)],
+    authenticated_user: Annotated[User, Depends(get_authenticated_user)],
     session: AsyncSession = Depends(db_session),
 ) -> User:
-    return current_user
+    return authenticated_user
diff --git a/backend/tests/fixtures/app.py b/backend/tests/fixtures/app.py
index 87404a5..11f3443 100644
--- a/backend/tests/fixtures/app.py
+++ b/backend/tests/fixtures/app.py
@@ -31,7 +31,7 @@ class AuthAsyncClient(AsyncClient):
     async def login(self, email: str, password: str) -> None:
         """login this client with the email and password"""
         response = await self.post(
-            "/login", data={"username": email, "password": password}
+            "/login", json={"username": email, "password": password}
         )
         assert (
             response.status_code == 200
diff --git a/backend/tests/user_api/test_handlers.py b/backend/tests/user_api/test_handlers.py
index 6234f52..1c9c121 100644
--- a/backend/tests/user_api/test_handlers.py
+++ b/backend/tests/user_api/test_handlers.py
@@ -265,12 +265,12 @@ async def test_login_fails_with_wrong_password(
 
     fail_response = await user_app_client.post(
         "/login",
-        data={"username": userdata["email"], "password": "incorrect_pass"},
+        json={"username": userdata["email"], "password": "incorrect_pass"},
     )
     assert fail_response.status_code == 401, "Expected authentication error."
 
     fail_response = await user_app_client.post(
-        "/login", data={"username": userdata["email"], "password": "admin"}
+        "/login", json={"username": userdata["email"], "password": "admin"}
     )
     assert fail_response.status_code == 200, "Expected user login."