|
- from typing import Optional
- #from fastapi.openapi.models import SecurityBase as SecurityBaseModel
- #from fastapi.security.base import SecurityBase
- from fastapi.openapi.models import OAuthFlows as OAuthFlowsModel
- from starlette.requests import Request
- from fastapi.security.utils import get_authorization_scheme_param
- from fastapi.security import OAuth2PasswordRequestForm, OAuth2
- from fastapi import Depends, FastAPI, HTTPException
- from starlette.status import HTTP_403_FORBIDDEN
-
-
- class OAuth2PasswordBearerCookie(OAuth2):
- def __init__(
- self,
- tokenUrl: str,
- scheme_name: str = None,
- scopes: dict = None,
- auto_error: bool = True,
- ):
- if not scopes:
- scopes = {}
- flows = OAuthFlowsModel(password={"tokenUrl": tokenUrl, "scopes": scopes})
- super().__init__(flows=flows, scheme_name=scheme_name, auto_error=auto_error)
-
- async def __call__(self, request: Request) -> Optional[str]:
- header_authorization: str = request.headers.get("Authorization")
- cookie_authorization: str = request.cookies.get("Authorization")
-
- header_scheme, header_param = get_authorization_scheme_param(
- header_authorization
- )
- cookie_scheme, cookie_param = get_authorization_scheme_param(
- cookie_authorization
- )
-
- if header_scheme.lower() == "bearer":
- authorization = True
- scheme = header_scheme
- param = header_param
-
- elif cookie_scheme.lower() == "bearer":
- authorization = True
- scheme = cookie_scheme
- param = cookie_param
-
- else:
- authorization = False
-
- if not authorization or scheme.lower() != "bearer":
- if self.auto_error:
- raise HTTPException(
- status_code=HTTP_403_FORBIDDEN, detail="Not authenticated"
- )
- else:
- return None
- return param
|