"""JWT authentication for the admin panel.""" from datetime import datetime, timedelta, timezone from fastapi import Depends, HTTPException, status from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm from jose import JWTError, jwt from pydantic import BaseModel from ..config import settings oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/api/admin/auth/token") class Token(BaseModel): access_token: str token_type: str def create_access_token(data: dict) -> str: to_encode = data.copy() expire = datetime.now(timezone.utc) + timedelta(minutes=settings.access_token_expire_minutes) to_encode["exp"] = expire return jwt.encode(to_encode, settings.secret_key, algorithm=settings.algorithm) async def get_current_admin(token: str = Depends(oauth2_scheme)) -> str: credentials_exception = HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid credentials", headers={"WWW-Authenticate": "Bearer"}, ) try: payload = jwt.decode(token, settings.secret_key, algorithms=[settings.algorithm]) username: str = payload.get("sub") if username is None: raise credentials_exception except JWTError: raise credentials_exception if username != settings.admin_username: raise credentials_exception return username async def login(form_data: OAuth2PasswordRequestForm = Depends()) -> Token: if form_data.username != settings.admin_username or form_data.password != settings.admin_password: raise HTTPException(status_code=400, detail="Incorrect username or password") token = create_access_token({"sub": form_data.username}) return Token(access_token=token, token_type="bearer")