import http.client import json import os from time import sleep from urllib.parse import urlencode class NotAuthenticated(Exception): pass class Authorization: token = "" lock = False @classmethod def __authorize(cls) -> None: cls.token = "" conn = http.client.HTTPSConnection(os.environ.get("AUTH0_HOST") or os.environ.get("ATLAS_HOST")) payload = { "client_id": os.environ.get("AUTH0_CLIENT_ID") or os.environ.get("ATLAS_CLIENT_ID"), "client_secret": os.environ.get("AUTH0_CLIENT_SECRET") or os.environ.get("ATLAS_CLIENT_SECRET"), "audience": os.environ.get("AUTH0_AUDIENCE") or os.environ.get("ATLAS_AUDIENCE"), "grant_type": os.environ.get("AUTH0_GRANT_TYPE", "client_credentials"), } if os.environ.get("AUTH0_USERNAME") and os.environ.get("AUTH0_PASSWORD"): payload["username"] = os.environ.get("AUTH0_USERNAME") payload["password"] = os.environ.get("AUTH0_PASSWORD") headers = {"content-type": "application/x-www-form-urlencoded"} conn.request("POST", "/oauth/token", urlencode(payload), headers) res = conn.getresponse() data = res.read() data = json.loads(data.decode("utf-8")) try: cls.token = "{} {}".format(data["token_type"], data["access_token"]) except KeyError: raise NotAuthenticated("Authorization failed") @classmethod def get_token(cls) -> str: while cls.lock: sleep(1) if not cls.token: cls.lock = True cls.__authorize() cls.lock = False return cls.token def get_auth_class(): if os.environ.get("ATLAS_CLIENT_ID") or os.environ.get("AUTH0_CLIENT_ID"): return Authorization