auth.py
Rama main · réplica de lectura del repositorio original.
"""Shared request-auth helpers (multi-user).
The middleware in main.py resolves the caller's API key to a user and
stores ``request.state.user_id`` / ``request.state.is_admin``. Routers must
read that state through these helpers — never trust a client-supplied
user_id — so all endpoints share one fail-closed code path.
"""
from fastapi import HTTPException, Request
def current_user(request: Request) -> str:
"""Return the authenticated user id, 401 when missing."""
uid = getattr(request.state, "user_id", None) or ""
if not uid:
raise HTTPException(status_code=401, detail="Invalid or missing API key")
return uid
def require_admin(request: Request, detail: str = "Admin only") -> str:
"""Return the user id; 401 when unauthenticated, 403 when not admin."""
uid = current_user(request)
if not bool(getattr(request.state, "is_admin", False)):
raise HTTPException(status_code=403, detail=detail)
return uid