1- from typing import Any
1+ from typing import Optional
22
33from fastapi import APIRouter , Depends , HTTPException , status
44from fastapi .security import OAuth2PasswordRequestForm
55from jose import jwt
66from pydantic import ValidationError
7+ from sqlalchemy import select
78from sqlalchemy .orm import Session
89
9- from app import crud , models , schemas
10+ from app import schemas
1011from app .api import deps
1112from app .core import security
1213from app .core .config import settings
14+ from app .models import User
1315
1416router = APIRouter ()
1517
1618
17- @router .post ("/login/ access-token" , response_model = schemas .Token )
19+ @router .post ("/access-token" , response_model = schemas .Token )
1820def login_access_token (
19- db : Session = Depends (deps .get_db ), form_data : OAuth2PasswordRequestForm = Depends ()
20- ) -> Any :
21+ session : Session = Depends (deps .get_session ),
22+ form_data : OAuth2PasswordRequestForm = Depends (),
23+ ):
2124 """
22- OAuth2 compatible token login , get an access token for future requests
25+ OAuth2 compatible token, get an access token for future requests using username and password
2326 """
24- user = crud .user .authenticate (
25- db , email = form_data .username , password = form_data .password
27+
28+ user : Optional [User ] = (
29+ session .execute (select (User ).where (User .email == form_data .username ))
30+ .scalars ()
31+ .first ()
2632 )
27- if not user :
33+
34+ if user is None :
35+ raise HTTPException (status_code = 400 , detail = "Incorrect email or password" )
36+
37+ if not security .verify_password (form_data .password , user .hashed_password ):
2838 raise HTTPException (status_code = 400 , detail = "Incorrect email or password" )
2939
3040 access_token , expire_at = security .create_access_token (user .id )
@@ -38,16 +48,19 @@ def login_access_token(
3848 }
3949
4050
41- @router .post ("/login/ test-token" , response_model = schemas .User )
42- def test_token (current_user : models . User = Depends (deps .get_current_user )) -> Any :
51+ @router .post ("/test-token" , response_model = schemas .User )
52+ def test_token (current_user : User = Depends (deps .get_current_user )):
4353 """
4454 Test access token
4555 """
4656 return current_user
4757
4858
4959@router .post ("/refresh-token" , response_model = schemas .Token )
50- async def refresh_token (refresh_token : str , db : Session = Depends (deps .get_db )):
60+ def refresh_token (refresh_token : str , session : Session = Depends (deps .get_session )):
61+ """
62+ OAuth2 compatible token, get an access token for future requests using refresh token
63+ """
5164 try :
5265 payload = jwt .decode (
5366 refresh_token , settings .SECRET_KEY , algorithms = [security .ALGORITHM ]
@@ -63,8 +76,12 @@ async def refresh_token(refresh_token: str, db: Session = Depends(deps.get_db)):
6376 status_code = status .HTTP_403_FORBIDDEN ,
6477 detail = "Could not validate credentials" ,
6578 )
66- user = crud .user .get (db , id = token_data .sub )
67- if not user :
79+
80+ user : Optional [User ] = (
81+ session .execute (select (User ).where (User .id == token_data .sub )).scalars ().first ()
82+ )
83+
84+ if user is None :
6885 raise HTTPException (status_code = 404 , detail = "User not found" )
6986 access_token , expire_at = security .create_access_token (user .id )
7087 refresh_token , refresh_expire_at = security .create_refresh_token (user .id )
0 commit comments