11from typing import Annotated
22
3- from fastapi import APIRouter , Depends , HTTPException
3+ from fastapi import APIRouter , Cookie , Depends , HTTPException , Response
44from fastapi .security import OAuth2PasswordRequestForm
55
66from src .auth import (
1010 refresh_access_token ,
1111)
1212from src .dependencies import Db
13- from src .models import Token
13+ from src .models import LoginData , RefreshToken , Token , UserMe
1414
1515router = APIRouter ()
1616
1919async def login_for_access_token (
2020 db : Db ,
2121 form_data : Annotated [OAuth2PasswordRequestForm , Depends ()],
22- ) -> Token :
22+ response : Response ,
23+ ) -> LoginData :
2324 user = await authenticate_user (db , form_data .username , form_data .password )
2425 if not user :
2526 raise HTTPException (
@@ -30,12 +31,21 @@ async def login_for_access_token(
3031 access_token = create_access_token (
3132 data = {"sub" : str (user .id )},
3233 )
33- refresh_token = create_refresh_token (data = {"sub" : str (user .id )})
34- return Token (
35- access_token = access_token , refresh_token = refresh_token , token_type = "bearer"
34+ (refresh_token , expiration ) = create_refresh_token (data = {"sub" : str (user .id )})
35+ response .set_cookie (
36+ "refresh_token" ,
37+ refresh_token ,
38+ httponly = True ,
39+ expires = int (expiration .total_seconds ()),
40+ )
41+ return LoginData (
42+ user_data = UserMe (** user .model_dump ()),
43+ token = Token (access_token = access_token , token_type = "bearer" ),
3644 )
3745
3846
39- @router .post ("/refresh" )
40- async def get_new_access_token (db : Db , refresh_token : str ):
41- return await refresh_access_token (db , refresh_token )
47+ @router .get ("/refresh" )
48+ async def get_new_access_token (
49+ db : Db , refresh_token : Annotated [RefreshToken , Cookie ()]
50+ ) -> Token :
51+ return Token (** (await refresh_access_token (db , refresh_token .refresh_token )))
0 commit comments