from abc import ABC from abc import abstractmethod from aiohttp import ClientResponse from aiohttp import ClientSession 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: str, url: str, **kwargs) -> ClientResponse: """Make a request.""" headers = kwargs.get("headers") if headers is None: headers = {} else: headers = dict(headers) del kwargs["headers"] 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, )