From df13fb29a585d65e796c51dd67703299f0318572 Mon Sep 17 00:00:00 2001 From: Willi Date: Tue, 21 May 2024 22:53:17 +0530 Subject: [PATCH] generalizes OAuth2 implementation. Provides example for Zoom Video communications --- dlt/sources/helpers/rest_client/auth.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/dlt/sources/helpers/rest_client/auth.py b/dlt/sources/helpers/rest_client/auth.py index b42471e102..d30a6307f5 100644 --- a/dlt/sources/helpers/rest_client/auth.py +++ b/dlt/sources/helpers/rest_client/auth.py @@ -1,4 +1,5 @@ import math +from abc import abstractmethod from base64 import b64encode from typing import ( TYPE_CHECKING, @@ -174,17 +175,26 @@ def __call__(self, request: PreparedRequest) -> PreparedRequest: def is_token_expired(self) -> bool: return pendulum.now() >= self.token_expiry - def obtain_token(self) -> None: - authentication: str = b64encode(f"{self.client_id}:{self.client_secret}".encode()).decode() + def build_access_token_request(self) -> dict[str]: + """ + This b64-encoded access token request is specific to Zoom. + Many other APIs implement OAuth2 differently + """ + authentication: str = b64encode( + f"{self.client_id}:{self.client_secret}".encode() + ).decode() - response = requests.post( - url=self.access_token_url, - headers={ + return { + "url": self.access_token_url, + "headers": { "Authorization": f"Basic {authentication}", "Content-Type": "application/x-www-form-urlencoded", }, - data=self.access_token_request_data, - ) + "data": self.access_token_request_data, + } + + def obtain_token(self) -> None: + response = requests.post(**self.build_access_token_request()) response.raise_for_status() self.access_token = response.json()["access_token"] expires_in = response.json().get("expires_in", self.default_token_expiration)