from abc import ABC, abstractmethod from aiohttp import ClientSession, ClientResponse class AbstractAuth(ABC): """Abstract class to make authenticated requests.""" def __init__(self, websession: ClientSession, host: str): """Initialize the auth.""" self.websession = websession self.host = host @abstractmethod async def async_get_access_token(self) -> str: """Return a valid access token.""" async def request(self, method, url, include_access_token: bool = True, **kwargs) -> ClientResponse: """Make a request.""" headers = kwargs.get("headers") if headers is None: headers = {} else: headers = kwargs.pop("headers") if (include_access_token): access_token = await self.async_get_access_token() headers["authorization"] = f"Bearer {access_token}" return await self.websession.request( method, f"{self.host}/{url}", **kwargs, headers=headers, )