From 15dc0d5980a733bf072eb03d04e2908f5646db56 Mon Sep 17 00:00:00 2001 From: Johan Castiblanco Date: Mon, 15 Jul 2024 17:15:07 -0500 Subject: [PATCH] refactor: extende OAUTH2Basic authenticator --- eox_nelp/api_clients/authenticators.py | 18 +++++++++++------- eox_nelp/api_clients/sms_vendor.py | 5 +++-- eox_nelp/settings/test.py | 1 + 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/eox_nelp/api_clients/authenticators.py b/eox_nelp/api_clients/authenticators.py index 534fbcb1..00ecad77 100644 --- a/eox_nelp/api_clients/authenticators.py +++ b/eox_nelp/api_clients/authenticators.py @@ -129,20 +129,24 @@ def authenticate(self, api_client): return session -class SMSVendoAuthenticator(BasicAuthAuthenticator): - """Authenticator for custom use of the SMS vendor particular API.""" +class Oauth2BasicAuthenticator(BasicAuthAuthenticator): + """Authenticator for custom use using basic auth to get a Oauth2 Token (Bearer or JWT). + Token_type on depends of the response used after the oauth2 token request. + Then the token is used for the next requests. + """ def authenticate(self, api_client): - """Authenticate the session with basic auth in order to get Bearer token. - Then the Bearer token is added to a new session Headers. - SMS vendor configuration. + """Authenticate the session with basic auth in order to get token(Bearer or JWT). + Then the token is added to a new session Headers. + Is needed the user, password and token_path class atrributes to the get oauth2 token, + based on the client configuration. """ auth_session = super().authenticate(api_client) - key = f"smsvendor-{api_client.user}-{api_client.password}" + key = f"oauth2-basic-{api_client.user}-{api_client.password}" headers = cache.get(key) if not headers: - authenticate_url = f"{api_client.base_url}/oauth2/v1/token" + authenticate_url = f"{api_client.base_url}/{api_client.token_path}" response = auth_session.post( url=authenticate_url, data={"grant_type": "client_credentials", "scope": "notification"} diff --git a/eox_nelp/api_clients/sms_vendor.py b/eox_nelp/api_clients/sms_vendor.py index 6e1aa33f..9edf3e55 100644 --- a/eox_nelp/api_clients/sms_vendor.py +++ b/eox_nelp/api_clients/sms_vendor.py @@ -6,7 +6,7 @@ from django.conf import settings from eox_nelp.api_clients import AbstractAPIRestClient -from eox_nelp.api_clients.authenticators import SMSVendoAuthenticator +from eox_nelp.api_clients.authenticators import Oauth2BasicAuthenticator try: from eox_audit_model.decorators import audit_method @@ -18,7 +18,7 @@ def audit_method(action): # pylint: disable=unused-argument class SMSVendorApiClient(AbstractAPIRestClient): """Allow to perform SMS send operations.""" - authentication_class = SMSVendoAuthenticator + authentication_class = Oauth2BasicAuthenticator @property def base_url(self): @@ -27,6 +27,7 @@ def base_url(self): def __init__(self): self.user = getattr(settings, "SMS_VENDOR_USERNAME") self.password = getattr(settings, "SMS_VENDOR_PASSWORD") + self.token_path = getattr(settings, "SMS_VENDOR_TOKEN_PATH") super().__init__() diff --git a/eox_nelp/settings/test.py b/eox_nelp/settings/test.py index 62aafdd3..542c0f3a 100644 --- a/eox_nelp/settings/test.py +++ b/eox_nelp/settings/test.py @@ -53,6 +53,7 @@ def plugin_settings(settings): # pylint: disable=function-redefined settings.SMS_VENDOR_URL = 'https://testing.com' settings.SMS_VENDOR_USERNAME = 'test-user' settings.SMS_VENDOR_PASSWORD = 'test-password' + settings.SMS_VENDOR_TOKEN_PATH = "oauth2/v1/token" settings.SMS_VENDOR_SEND_SMS_PATH = 'sms/send' settings.PEARSON_RTI_WSDL_URL = 'https://testing.com'