From 01d37706d6750c20952cf01b6a616b23aafa5be9 Mon Sep 17 00:00:00 2001 From: Dumitru Uzun Date: Wed, 6 Sep 2023 18:00:24 +0200 Subject: [PATCH] fix: Make external_account resistant to string type 'expires_in' responses from non-compliant services (#1379) Make external_account resistant to string type 'expires_in' responses from non-compliant services. This is to complete [#1208](https://togithub.com/googleapis/google-auth-library-python/pull/1208/). A client run into this error. --- google/auth/external_account.py | 9 ++++++++- system_tests/secrets.tar.enc | Bin 10324 -> 10324 bytes tests/test_external_account.py | 7 ++++--- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/google/auth/external_account.py b/google/auth/external_account.py index 001b26f7f..c45e6f213 100644 --- a/google/auth/external_account.py +++ b/google/auth/external_account.py @@ -385,7 +385,14 @@ def refresh(self, request): additional_headers=additional_headers, ) self.token = response_data.get("access_token") - lifetime = datetime.timedelta(seconds=response_data.get("expires_in")) + expires_in = response_data.get("expires_in") + # Some services do not respect the OAUTH2.0 RFC and send expires_in as a + # JSON String. + if isinstance(expires_in, str): + expires_in = int(expires_in) + + lifetime = datetime.timedelta(seconds=expires_in) + self.expiry = now + lifetime @_helpers.copy_docstring(credentials.CredentialsWithQuotaProject) diff --git a/system_tests/secrets.tar.enc b/system_tests/secrets.tar.enc index c1792fbd9fa93c7be906b26738ffb3be57698fa5..fd667ebc8ffeacc7e07feedd0545ec975a64bac9 100644 GIT binary patch literal 10324 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 ma9KA6ZPtOjHd4QY6X9D?`PCyKw7C3b_@0