2025-07-18 18:43:30 +02:00

58 lines
2.0 KiB
Python

import jwt
from fastapi import APIRouter, Body, HTTPException
from ..config import settings
from ..db.core import init_user_data
from ..deps import SessionDep
from ..models.models import LoginRegisterModel, Token, User
from ..security import (create_access_token, create_tokens, hash_password,
verify_password)
router = APIRouter(prefix="/api/auth", tags=["auth"])
@router.post("/login", response_model=Token)
def login(req: LoginRegisterModel, session: SessionDep) -> Token:
db_user = session.get(User, req.username)
if not db_user or not verify_password(req.password, db_user.password):
raise HTTPException(status_code=401, detail="Invalid credentials")
return create_tokens(data={"sub": db_user.username})
@router.post("/register", response_model=Token)
def register(req: LoginRegisterModel, session: SessionDep) -> Token:
db_user = session.get(User, req.username)
if db_user:
raise HTTPException(status_code=409, detail="The resource already exists")
new_user = User(username=req.username, password=hash_password(req.password))
session.add(new_user)
session.commit()
init_user_data(session, new_user.username)
return create_tokens(data={"sub": new_user.username})
@router.post("/refresh")
def refresh_token(refresh_token: str = Body(..., embed=True)):
if not refresh_token:
raise HTTPException(status_code=400, detail="Refresh token expected")
try:
payload = jwt.decode(refresh_token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM])
username = payload.get("sub", None)
if username is None:
raise HTTPException(status_code=401, detail="Invalid Token")
new_access_token = create_access_token(data={"sub": username})
return {"access_token": new_access_token}
except jwt.ExpiredSignatureError:
raise HTTPException(status_code=401, detail="Invalid Token")
except jwt.PyJWTError:
raise HTTPException(status_code=401, detail="Invalid Token")