from fastapi import HTTPException, Security from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm from jose import JWTError, jwt from datetime import datetime, timedelta from typing import Optional from dotenv import load_dotenv import os load_dotenv() SECRET_KEY = os.getenv("FASTAPI_SECRET_KEY") ALGORITHM = "HS256" ACCESS_TOKEN_EXPIRE_MINUTES = 30 oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") class TokenData: username: Optional[str] = None def create_access_token(data: dict, expires_delta: Optional[timedelta] = None): to_encode = data.copy() if expires_delta: expire = datetime.utcnow() + expires_delta else: expire = datetime.utcnow() + timedelta(minutes=15) to_encode.update({"exp": expire}) encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) return encoded_jwt def verify_token(token: str, credentials_exception): try: payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) username: str = payload.get("sub") if username is None: raise credentials_exception token_data = TokenData(username=username) except JWTError: raise credentials_exception def admin_dependency(token: str = Security(oauth2_scheme)): credentials_exception = HTTPException( status_code=HTTPException, detail="Could not validate credentials", headers={"WWW-Authenticate": "Bearer"}, ) return verify_token(token, credentials_exception)