from enum import Enum
from abc import ABC, abstractmethod
from sinch.domains.authentication.models.v1.authentication import OAuthToken
from sinch.domains.authentication.endpoints.v1.oauth import OAuthEndpoint
from sinch.core.exceptions import ValidationException
[docs]
class TokenState(Enum):
VALID = "VALID"
INVALID = "INVALID"
EXPIRED = "EXPIRED"
[docs]
class TokenManagerBase(ABC):
def __init__(self, sinch):
self.sinch = sinch
self.token = None
self.token_state = TokenState.INVALID
[docs]
@abstractmethod
def get_auth_token(self) -> OAuthToken:
pass
[docs]
def invalidate_expired_token(self):
self.token = None
self.token_state = TokenState.EXPIRED
[docs]
def handle_invalid_token(self, http_response):
if http_response.headers.get("www-authenticate") and "expired" in http_response.headers["www-authenticate"]:
self.invalidate_expired_token()
[docs]
def set_auth_token(self, token) -> None:
try:
self.token = OAuthToken(**token)
self.token_state = TokenState.VALID
except TypeError:
raise ValidationException(
"Invalid authentication token structure",
is_from_server=False,
response=None
)
[docs]
class TokenManager(TokenManagerBase):
[docs]
def get_auth_token(self) -> OAuthToken:
if self.token:
return self.token
self.token = self.sinch.configuration.transport.request(OAuthEndpoint())
self.token_state = TokenState.VALID
return self.token