Esempio n. 1
0
def get_session_using_saver(saver: Saver, sess: Union[OAuth2Service, OAuth1Service], code: str,
                            default_expiration_time_second: int = 3600, name: str = "") \
  -> Tuple[Union[OAuth2Service, OAuth1Service], Union[str, None], Union[str, None], Union[str, None],
           Union[str, int, None]]:
    global args

    def global_decoder(payload):
        """
		Decoder for global API
		:param payload: The payload to decode
		:return: Return a dictionary that contains all data given by the API
		"""
        results = json.loads(payload.decode('utf-8'))
        if "access_token" in results.keys():
            saver["access_token"] = results["access_token"]
            saver["access_token_timestamp"] = int(time.time())
            if args.debug:
                print("{} access token = {}".format(name,
                                                    results["access_token"]))
        if "refresh_token" in results.keys():
            saver["refresh_token"] = results["refresh_token"]
        if "token_type" in results.keys():
            saver["token_type"] = results["token_type"]
        if "expires_in" in results.keys():
            saver["expires_in"] = results["expires_in"]
        return results

    # If the access and refresh tokens are already saved, use them
    if {"access_token", "access_token_timestamp", "token_type"}.issubset(
      saver.keys()) and saver.get("access_token_timestamp", None) is not None and int(time.time()) - \
      int(saver["access_token_timestamp"]) <= int(saver.get("expires_in", default_expiration_time_second)):
        access_token = saver["access_token"]
        if args.debug:
            print("{} access token = {}".format(name, access_token))
        if "refresh_token" in saver.keys():
            refresh_token = saver["refresh_token"]
        else:
            refresh_token = None
        token_type = saver["token_type"]
        if "expires_in" in saver.keys():
            expires_in = saver["expires_in"]
        else:
            expires_in = None
        session = sess.get_session(token=access_token)
    else:
        access_token = refresh_token = token_type = expires_in = None
        data = {
            "code": code,
            "grant_type": "authorization_code",
            "redirect_uri": redirect_uri
        }
        if args.debug:
            print("{} payload = {}".format(name, data))
        session = sess.get_auth_session(data=data, decoder=global_decoder)

    return session, access_token, refresh_token, token_type, expires_in