You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

28 lines
1.0 KiB

  1. from typing import Optional
  2. from fastapi.openapi.models import SecurityBase as SecurityBaseModel
  3. from fastapi.security.base import SecurityBase
  4. from starlette.requests import Request
  5. from fastapi.security.utils import get_authorization_scheme_param
  6. class SecurityBase:
  7. model: SecurityBaseModel
  8. scheme_name: str
  9. class BasicAuth(SecurityBase):
  10. def __init__(self, scheme_name: str = None, auto_error: bool = True):
  11. self.scheme_name = scheme_name or self.__class__.__name__
  12. self.model = SecurityBaseModel(type="http")
  13. self.auto_error = auto_error
  14. async def __call__(self, request: Request) -> Optional[str]:
  15. authorization: str = request.headers.get("Authorization")
  16. scheme, param = get_authorization_scheme_param(authorization)
  17. if not authorization or scheme.lower() != "basic":
  18. if self.auto_error:
  19. raise HTTPException(
  20. status_code=HTTP_403_FORBIDDEN, detail="Not authenticated"
  21. )
  22. else:
  23. return None
  24. return param