geo/backend/app/api/deps.py

50 lines
1.3 KiB
Python

from functools import lru_cache
from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
from jose import JWTError
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.database import get_db
from app.models.user import User
from app.services.api_key_manager import APIKeyManager
from app.services.auth import verify_token
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/api/v1/auth/login")
@lru_cache(maxsize=1)
def get_key_manager() -> APIKeyManager:
manager = APIKeyManager()
manager.load_env_keys()
return manager
async def get_current_user(
token: str = Depends(oauth2_scheme),
db: AsyncSession = Depends(get_db),
) -> User:
credentials_exception = HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Could not validate credentials",
headers={"WWW-Authenticate": "Bearer"},
)
try:
payload = verify_token(token)
user_id: str | None = payload.get("sub")
if user_id is None:
raise credentials_exception
except (JWTError, ValueError):
raise credentials_exception
stmt = select(User).where(User.id == user_id)
result = await db.execute(stmt)
user = result.scalar_one_or_none()
if user is None:
raise credentials_exception
return user