any2human / app /auth /deps.py
idnameraj's picture
Upload 73 files
fe5d482 verified
Raw
History Blame Contribute Delete
1.52 kB
"""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:
# Expired/invalid tokens should not break public/preview endpoints
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)
# Alias for readability at call sites
CurrentUser = Depends(require_user)