43 lines
1.5 KiB
Python
43 lines
1.5 KiB
Python
from datetime import timedelta
|
|
from typing import Annotated
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from fastapi.security import OAuth2PasswordRequestForm
|
|
from psycopg2._psycopg import connection
|
|
|
|
from api.models import Token
|
|
from api.utils import authenticate_user, create_access_token
|
|
from db.internal import get_db_connection
|
|
from db.users import check_user_disabled
|
|
from settings import startup_settings
|
|
|
|
auth_router = APIRouter(prefix="/api", tags=["auth"])
|
|
|
|
|
|
@auth_router.post("/token")
|
|
async def login(
|
|
form_data: Annotated[OAuth2PasswordRequestForm, Depends()],
|
|
conn: Annotated[connection, Depends(get_db_connection)]
|
|
) -> Token:
|
|
password_correct = authenticate_user(conn, form_data.username, form_data.password)
|
|
if not password_correct:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
detail="Incorrect username or password",
|
|
headers={"WWW-Authenticate": "Bearer"},
|
|
)
|
|
|
|
user_disabled = check_user_disabled(conn, form_data.username)
|
|
if user_disabled:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
detail="User acoount is disabled",
|
|
headers={"WWW-Authenticate": "Bearer"},
|
|
)
|
|
|
|
access_token_expire_time = timedelta(minutes=startup_settings.access_token_expiration_time)
|
|
access_token = create_access_token(
|
|
data={"sub": form_data.username}, expires_delta=access_token_expire_time
|
|
)
|
|
return Token(access_token=access_token, token_type="bearer")
|