from typing import Optional from fastapi.openapi.models import SecurityBase as SecurityBaseModel from fastapi.security.base import SecurityBase from starlette.requests import Request from fastapi.security.utils import get_authorization_scheme_param class SecurityBase: model: SecurityBaseModel scheme_name: str class BasicAuth(SecurityBase): def __init__(self, scheme_name: str = None, auto_error: bool = True): self.scheme_name = scheme_name or self.__class__.__name__ self.model = SecurityBaseModel(type="http") self.auto_error = auto_error async def __call__(self, request: Request) -> Optional[str]: authorization: str = request.headers.get("Authorization") scheme, param = get_authorization_scheme_param(authorization) if not authorization or scheme.lower() != "basic": if self.auto_error: raise HTTPException( status_code=HTTP_403_FORBIDDEN, detail="Not authenticated" ) else: return None return param