28 lines
920 B
Python
28 lines
920 B
Python
|
|
"""FastAPI dependencies for authentication."""
|
||
|
|
from fastapi import Depends, HTTPException, status
|
||
|
|
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
|
||
|
|
|
||
|
|
from .service import decode_access_token
|
||
|
|
|
||
|
|
security = HTTPBearer()
|
||
|
|
|
||
|
|
|
||
|
|
async def get_current_user(
|
||
|
|
credentials: HTTPAuthorizationCredentials = Depends(security),
|
||
|
|
) -> str:
|
||
|
|
"""Extract and validate the current user from the Authorization header."""
|
||
|
|
payload = decode_access_token(credentials.credentials)
|
||
|
|
if payload is None:
|
||
|
|
raise HTTPException(
|
||
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
||
|
|
detail="Invalid or expired token",
|
||
|
|
headers={"WWW-Authenticate": "Bearer"},
|
||
|
|
)
|
||
|
|
username: str | None = payload.get("sub")
|
||
|
|
if not username:
|
||
|
|
raise HTTPException(
|
||
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
||
|
|
detail="Token missing subject",
|
||
|
|
)
|
||
|
|
return username
|