| """FastAPI auth dependencies."""
|
|
|
| from __future__ import annotations
|
|
|
| from fastapi import Depends, Header, HTTPException, status
|
|
|
| from app.auth.supabase_client import AuthUser, verify_access_token
|
| from app.config import AUTH_ENABLED
|
|
|
|
|
| def _bearer_token(authorization: str | None) -> str:
|
| if not authorization:
|
| return ""
|
| parts = authorization.split(" ", 1)
|
| if len(parts) != 2 or parts[0].lower() != "bearer":
|
| return ""
|
| return parts[1].strip()
|
|
|
|
|
| async def optional_user(
|
| authorization: str | None = Header(default=None),
|
| ) -> AuthUser | None:
|
| if not AUTH_ENABLED:
|
| return None
|
| token = _bearer_token(authorization)
|
| if not token:
|
| return None
|
| try:
|
| return verify_access_token(token)
|
| except HTTPException:
|
|
|
| return None
|
|
|
|
|
| async def require_user(
|
| authorization: str | None = Header(default=None),
|
| ) -> AuthUser | None:
|
| """Require a logged-in user when auth is enabled; otherwise allow open access."""
|
| if not AUTH_ENABLED:
|
| return None
|
| token = _bearer_token(authorization)
|
| if not token:
|
| raise HTTPException(
|
| status_code=status.HTTP_401_UNAUTHORIZED,
|
| detail="Sign in to rewrite text.",
|
| headers={"WWW-Authenticate": "Bearer"},
|
| )
|
| return verify_access_token(token)
|
|
|
|
|
|
|
| CurrentUser = Depends(require_user)
|
|
|