from fastapi import APIRouter, Depends, status, HTTPException, Response from fastapi.security.oauth2 import OAuth2PasswordRequestForm from sqlalchemy.orm import Session from .. import database, schemas, models, security, utils router = APIRouter(tags=['Authentication']) @router.post('/login', response_model=schemas.Token) def login(user_credentials: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(database.get_db)): user = db.query(models.Users).filter( models.Users.Email == user_credentials.username).first() if not user: raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, detail="Invalid Credentials") if not utils.verify(user_credentials.password, user.Hashed_password): raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, detail="Invalid Credentials") access_token = security.create_access_token(data={ "UserID": user.UserID, "Email": user.Email }) refresh_token = security.create_refresh_token(data={ "UserID": user.UserID, }) return {"access_token": access_token, "refresh_token": refresh_token} @router.post('/refresh', response_model=schemas.Token, response_model_exclude_none=True ) def refresh_access_token(refresh_token: str, db: Session = Depends(database.get_db)): user_id = security.verify_refresh_token(refresh_token) user = db.query(models.Users).filter( models.Users.UserID == user_id).first() if not user: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="User not found") access_token = security.create_access_token(data={ "UserID": user.UserID, "Email": user.Email }) return {"access_token": access_token}