From 83b20f0b4d32b2ff1183a9c2926afd37f3baf92b Mon Sep 17 00:00:00 2001 From: arithmetic1728 <58957152+arithmetic1728@users.noreply.github.com> Date: Fri, 28 Jan 2022 16:47:19 -0800 Subject: [PATCH 1/5] chore: update user creds for system test (#963) --- system_tests/secrets.tar.enc | Bin 10324 -> 10324 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/system_tests/secrets.tar.enc b/system_tests/secrets.tar.enc index 77e60a3091201b58e1e56dd722425a57acd72775..c8678e3ee8cc6ce72cacd17119f4ad882da890be 100644 GIT binary patch literal 10324 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 literal 10324 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 Date: Fri, 28 Jan 2022 20:10:48 -0500 Subject: [PATCH 2/5] feat: ADC can load an impersonated service account credentials. (#962) * Make the impersonated credentials to be Scoped so default func will add scopes. * Add tests for impersonated service account credentials. Co-authored-by: Anthonios Partheniou --- google/auth/impersonated_credentials.py | 20 ++++++++- tests/test__default.py | 54 +++++++++++++++++++++++++ tests/test_impersonated_credentials.py | 16 ++++++++ 3 files changed, 89 insertions(+), 1 deletion(-) diff --git a/google/auth/impersonated_credentials.py b/google/auth/impersonated_credentials.py index 80d6fdfdc..48acd1bb3 100644 --- a/google/auth/impersonated_credentials.py +++ b/google/auth/impersonated_credentials.py @@ -120,7 +120,9 @@ def _make_iam_token_request( six.raise_from(new_exc, caught_exc) -class Credentials(credentials.CredentialsWithQuotaProject, credentials.Signing): +class Credentials( + credentials.Scoped, credentials.CredentialsWithQuotaProject, credentials.Signing +): """This module defines impersonated credentials which are essentially impersonated identities. @@ -309,6 +311,10 @@ def service_account_email(self): def signer(self): return self + @property + def requires_scopes(self): + return not self._target_scopes + @_helpers.copy_docstring(credentials.CredentialsWithQuotaProject) def with_quota_project(self, quota_project_id): return self.__class__( @@ -321,6 +327,18 @@ def with_quota_project(self, quota_project_id): iam_endpoint_override=self._iam_endpoint_override, ) + @_helpers.copy_docstring(credentials.Scoped) + def with_scopes(self, scopes, default_scopes=None): + return self.__class__( + self._source_credentials, + target_principal=self._target_principal, + target_scopes=scopes or default_scopes, + delegates=self._delegates, + lifetime=self._lifetime, + quota_project_id=self._quota_project_id, + iam_endpoint_override=self._iam_endpoint_override, + ) + class IDTokenCredentials(credentials.CredentialsWithQuotaProject): """Open ID Connect ID Token-based service account credentials. diff --git a/tests/test__default.py b/tests/test__default.py index 1c27ac11c..35a5dc021 100644 --- a/tests/test__default.py +++ b/tests/test__default.py @@ -1089,6 +1089,60 @@ def test_default_no_warning_with_quota_project_id_for_user_creds(get_adc_path): credentials, project_id = _default.default(quota_project_id="project-foo") +@mock.patch( + "google.auth._cloud_sdk.get_application_default_credentials_path", autospec=True +) +def test_default_impersonated_service_account(get_adc_path): + get_adc_path.return_value = IMPERSONATED_SERVICE_ACCOUNT_AUTHORIZED_USER_SOURCE_FILE + + credentials, _ = _default.default() + + assert isinstance(credentials, impersonated_credentials.Credentials) + assert isinstance( + credentials._source_credentials, google.oauth2.credentials.Credentials + ) + assert credentials.service_account_email == "service-account-target@example.com" + assert credentials._delegates == ["service-account-delegate@example.com"] + assert not credentials._quota_project_id + assert not credentials._target_scopes + + +@mock.patch( + "google.auth._cloud_sdk.get_application_default_credentials_path", autospec=True +) +def test_default_impersonated_service_account_set_scopes(get_adc_path): + get_adc_path.return_value = IMPERSONATED_SERVICE_ACCOUNT_AUTHORIZED_USER_SOURCE_FILE + scopes = ["scope1", "scope2"] + + credentials, _ = _default.default(scopes=scopes) + assert credentials._target_scopes == scopes + + +@mock.patch( + "google.auth._cloud_sdk.get_application_default_credentials_path", autospec=True +) +def test_default_impersonated_service_account_set_default_scopes(get_adc_path): + get_adc_path.return_value = IMPERSONATED_SERVICE_ACCOUNT_AUTHORIZED_USER_SOURCE_FILE + default_scopes = ["scope1", "scope2"] + + credentials, _ = _default.default(default_scopes=default_scopes) + assert credentials._target_scopes == default_scopes + + +@mock.patch( + "google.auth._cloud_sdk.get_application_default_credentials_path", autospec=True +) +def test_default_impersonated_service_account_set_both_scopes_and_default_scopes( + get_adc_path +): + get_adc_path.return_value = IMPERSONATED_SERVICE_ACCOUNT_AUTHORIZED_USER_SOURCE_FILE + scopes = ["scope1", "scope2"] + default_scopes = ["scope3", "scope4"] + + credentials, _ = _default.default(scopes=scopes, default_scopes=default_scopes) + assert credentials._target_scopes == scopes + + def test__get_api_key_credentials_no_env_var(): cred, project_id = _default._get_api_key_credentials(quota_project_id="project-foo") assert cred is None diff --git a/tests/test_impersonated_credentials.py b/tests/test_impersonated_credentials.py index 58d159a59..f65fb7541 100644 --- a/tests/test_impersonated_credentials.py +++ b/tests/test_impersonated_credentials.py @@ -399,6 +399,22 @@ def test_with_quota_project_iam_endpoint_override( request_kwargs = request.call_args[1] assert request_kwargs["url"] == self.IAM_ENDPOINT_OVERRIDE + def test_with_scopes(self): + credentials = self.make_credentials() + credentials._target_scopes = [] + assert credentials.requires_scopes is True + credentials = credentials.with_scopes(["fake_scope1", "fake_scope2"]) + assert credentials.requires_scopes is False + assert credentials._target_scopes == ["fake_scope1", "fake_scope2"] + + def test_with_scopes_provide_default_scopes(self): + credentials = self.make_credentials() + credentials._target_scopes = [] + credentials = credentials.with_scopes( + ["fake_scope1"], default_scopes=["fake_scope2"] + ) + assert credentials._target_scopes == ["fake_scope1"] + def test_id_token_success( self, mock_donor_credentials, mock_authorizedsession_idtoken ): From 3c72365d8407bb097568919123cd7232c1a49f4f Mon Sep 17 00:00:00 2001 From: arithmetic1728 <58957152+arithmetic1728@users.noreply.github.com> Date: Mon, 31 Jan 2022 11:33:20 -0800 Subject: [PATCH 3/5] chore: update user cred for system test (#966) --- system_tests/secrets.tar.enc | Bin 10324 -> 10324 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/system_tests/secrets.tar.enc b/system_tests/secrets.tar.enc index c8678e3ee8cc6ce72cacd17119f4ad882da890be..ab9084e82c8b526bec4de7e8dc8a3bb01f7b730d 100644 GIT binary patch literal 10324 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 literal 10324 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 From f9f23f4370f2a7a5b2c66ee56a5e700ef03b5b06 Mon Sep 17 00:00:00 2001 From: arithmetic1728 <58957152+arithmetic1728@users.noreply.github.com> Date: Mon, 31 Jan 2022 13:51:40 -0800 Subject: [PATCH 4/5] fix: revert "feat: add api key support (#826)" (#964) This reverts commit 3b15092b3461278400e4683060f64a96d50587c4. Co-authored-by: Anthonios Partheniou --- google/auth/_default.py | 36 +------------ google/auth/_default_async.py | 36 +------------ google/auth/api_key.py | 83 ------------------------------ google/auth/environment_vars.py | 3 -- tests/test__default.py | 44 ---------------- tests/test_api_key.py | 45 ---------------- tests_async/test__default_async.py | 44 ---------------- 7 files changed, 2 insertions(+), 289 deletions(-) delete mode 100644 google/auth/api_key.py delete mode 100644 tests/test_api_key.py diff --git a/google/auth/_default.py b/google/auth/_default.py index c70dccfaa..34edda046 100644 --- a/google/auth/_default.py +++ b/google/auth/_default.py @@ -345,24 +345,6 @@ def _get_external_account_credentials( return credentials, credentials.get_project_id(request=request) -def _get_api_key_credentials(quota_project_id=None): - """Gets API key credentials and project ID.""" - from google.auth import api_key - - api_key_value = os.environ.get(environment_vars.API_KEY) - if api_key_value: - return api_key.Credentials(api_key_value), quota_project_id - else: - return None, None - - -def get_api_key_credentials(api_key_value): - """Gets API key credentials using the given api key value.""" - from google.auth import api_key - - return api_key.Credentials(api_key_value) - - def _get_authorized_user_credentials(filename, info, scopes=None): from google.oauth2 import credentials @@ -458,14 +440,7 @@ def default(scopes=None, request=None, quota_project_id=None, default_scopes=Non This function acquires credentials from the environment in the following order: - 1. If both ``GOOGLE_API_KEY`` and ``GOOGLE_APPLICATION_CREDENTIALS`` - environment variables are set, throw an exception. - - If ``GOOGLE_API_KEY`` is set, an `API Key`_ credentials will be returned. - The project ID returned is the one defined by ``GOOGLE_CLOUD_PROJECT`` or - ``GCLOUD_PROJECT`` environment variables. - - If the environment variable ``GOOGLE_APPLICATION_CREDENTIALS`` is set + 1. If the environment variable ``GOOGLE_APPLICATION_CREDENTIALS`` is set to the path of a valid service account JSON private key file, then it is loaded and returned. The project ID returned is the project ID defined in the service account file if available (some older files do not @@ -513,7 +488,6 @@ def default(scopes=None, request=None, quota_project_id=None, default_scopes=Non .. _Metadata Service: https://cloud.google.com/compute/docs\ /storing-retrieving-metadata .. _Cloud Run: https://cloud.google.com/run - .. _API Key: https://cloud.google.com/docs/authentication/api-keys Example:: @@ -555,19 +529,11 @@ def default(scopes=None, request=None, quota_project_id=None, default_scopes=Non environment_vars.PROJECT, os.environ.get(environment_vars.LEGACY_PROJECT) ) - if os.environ.get(environment_vars.API_KEY) and os.environ.get( - environment_vars.CREDENTIALS - ): - raise exceptions.DefaultCredentialsError( - "Environment variables GOOGLE_API_KEY and GOOGLE_APPLICATION_CREDENTIALS are mutually exclusive" - ) - checkers = ( # Avoid passing scopes here to prevent passing scopes to user credentials. # with_scopes_if_required() below will ensure scopes/default scopes are # safely set on the returned credentials since requires_scopes will # guard against setting scopes on user credentials. - lambda: _get_api_key_credentials(quota_project_id=quota_project_id), lambda: _get_explicit_environ_credentials(quota_project_id=quota_project_id), lambda: _get_gcloud_sdk_credentials(quota_project_id=quota_project_id), _get_gae_credentials, diff --git a/google/auth/_default_async.py b/google/auth/_default_async.py index a6f7d7777..5a41f2a6e 100644 --- a/google/auth/_default_async.py +++ b/google/auth/_default_async.py @@ -161,24 +161,6 @@ def _get_gae_credentials(): return _default._get_gae_credentials() -def _get_api_key_credentials(quota_project_id=None): - """Gets API key credentials and project ID.""" - from google.auth import api_key - - api_key_value = os.environ.get(environment_vars.API_KEY) - if api_key_value: - return api_key.Credentials(api_key_value), quota_project_id - else: - return None, None - - -def get_api_key_credentials(api_key_value): - """Gets API key credentials using the given api key value.""" - from google.auth import api_key - - return api_key.Credentials(api_key_value) - - def _get_gce_credentials(request=None): """Gets credentials and project ID from the GCE Metadata Service.""" # Ping requires a transport, but we want application default credentials @@ -200,14 +182,7 @@ def default_async(scopes=None, request=None, quota_project_id=None): This function acquires credentials from the environment in the following order: - 1. If both ``GOOGLE_API_KEY`` and ``GOOGLE_APPLICATION_CREDENTIALS`` - environment variables are set, throw an exception. - - If ``GOOGLE_API_KEY`` is set, an `API Key`_ credentials will be returned. - The project ID returned is the one defined by ``GOOGLE_CLOUD_PROJECT`` or - ``GCLOUD_PROJECT`` environment variables. - - If the environment variable ``GOOGLE_APPLICATION_CREDENTIALS`` is set + 1. If the environment variable ``GOOGLE_APPLICATION_CREDENTIALS`` is set to the path of a valid service account JSON private key file, then it is loaded and returned. The project ID returned is the project ID defined in the service account file if available (some older files do not @@ -246,7 +221,6 @@ def default_async(scopes=None, request=None, quota_project_id=None): .. _Metadata Service: https://cloud.google.com/compute/docs\ /storing-retrieving-metadata .. _Cloud Run: https://cloud.google.com/run - .. _API Key: https://cloud.google.com/docs/authentication/api-keys Example:: @@ -282,15 +256,7 @@ def default_async(scopes=None, request=None, quota_project_id=None): environment_vars.PROJECT, os.environ.get(environment_vars.LEGACY_PROJECT) ) - if os.environ.get(environment_vars.API_KEY) and os.environ.get( - environment_vars.CREDENTIALS - ): - raise exceptions.DefaultCredentialsError( - "GOOGLE_API_KEY and GOOGLE_APPLICATION_CREDENTIALS are mutually exclusive" - ) - checkers = ( - lambda: _get_api_key_credentials(quota_project_id=quota_project_id), lambda: _get_explicit_environ_credentials(quota_project_id=quota_project_id), lambda: _get_gcloud_sdk_credentials(quota_project_id=quota_project_id), _get_gae_credentials, diff --git a/google/auth/api_key.py b/google/auth/api_key.py deleted file mode 100644 index 7cdef429c..000000000 --- a/google/auth/api_key.py +++ /dev/null @@ -1,83 +0,0 @@ -# Copyright 2021 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Google API key support. - -This module provides authentication using the `API key`_. - - -.. _API key: - https://cloud.google.com/docs/authentication/api-keys/ -""" - -from google.auth import _helpers -from google.auth import credentials - - -class Credentials(credentials.Credentials): - """API key credentials. - - These credentials use API key to provide authorization to applications. - """ - - def __init__(self, token): - """ - Args: - token (str): API key string - - Raises: - ValueError: If the provided API key is not a non-empty string. - """ - if not token: - raise ValueError("Token must be a non-empty API key string") - super(Credentials, self).__init__() - self.token = token - - @property - def expired(self): - return False - - @property - def valid(self): - return True - - @_helpers.copy_docstring(credentials.Credentials) - def refresh(self, request): - return - - def apply(self, headers, token=None): - """Apply the API key token to the x-goog-api-key header. - - Args: - headers (Mapping): The HTTP request headers. - token (Optional[str]): If specified, overrides the current access - token. - """ - headers["x-goog-api-key"] = token or self.token - - def before_request(self, request, method, url, headers): - """Performs credential-specific before request logic. - - Refreshes the credentials if necessary, then calls :meth:`apply` to - apply the token to the x-goog-api-key header. - - Args: - request (google.auth.transport.Request): The object used to make - HTTP requests. - method (str): The request's HTTP method or the RPC method being - invoked. - url (str): The request's URI or the RPC service's URI. - headers (Mapping): The request's headers. - """ - self.apply(headers) diff --git a/google/auth/environment_vars.py b/google/auth/environment_vars.py index d872c95f9..c076dc59d 100644 --- a/google/auth/environment_vars.py +++ b/google/auth/environment_vars.py @@ -33,9 +33,6 @@ """Environment variable defining the location of Google application default credentials.""" -API_KEY = "GOOGLE_API_KEY" -"""Environment variable defining the API key value.""" - # The environment variable name which can replace ~/.config if set. CLOUD_SDK_CONFIG_DIR = "CLOUDSDK_CONFIG" """Environment variable defines the location of Google Cloud SDK's config diff --git a/tests/test__default.py b/tests/test__default.py index 35a5dc021..ed64bc723 100644 --- a/tests/test__default.py +++ b/tests/test__default.py @@ -19,7 +19,6 @@ import pytest # type: ignore from google.auth import _default -from google.auth import api_key from google.auth import app_engine from google.auth import aws from google.auth import compute_engine @@ -1141,46 +1140,3 @@ def test_default_impersonated_service_account_set_both_scopes_and_default_scopes credentials, _ = _default.default(scopes=scopes, default_scopes=default_scopes) assert credentials._target_scopes == scopes - - -def test__get_api_key_credentials_no_env_var(): - cred, project_id = _default._get_api_key_credentials(quota_project_id="project-foo") - assert cred is None - assert project_id is None - - -def test__get_api_key_credentials_from_env_var(): - with mock.patch.dict(os.environ, {environment_vars.API_KEY: "api-key"}): - cred, project_id = _default._get_api_key_credentials( - quota_project_id="project-foo" - ) - assert isinstance(cred, api_key.Credentials) - assert cred.token == "api-key" - assert project_id == "project-foo" - - -def test_exception_with_api_key_and_adc_env_var(): - with mock.patch.dict(os.environ, {environment_vars.API_KEY: "api-key"}): - with mock.patch.dict( - os.environ, {environment_vars.CREDENTIALS: "/path/to/json"} - ): - with pytest.raises(exceptions.DefaultCredentialsError) as excinfo: - _default.default() - - assert excinfo.match( - r"GOOGLE_API_KEY and GOOGLE_APPLICATION_CREDENTIALS are mutually exclusive" - ) - - -def test_default_api_key_from_env_var(): - with mock.patch.dict(os.environ, {environment_vars.API_KEY: "api-key"}): - cred, project_id = _default.default() - assert isinstance(cred, api_key.Credentials) - assert cred.token == "api-key" - assert project_id is None - - -def test_get_api_key_credentials(): - cred = _default.get_api_key_credentials("api-key") - assert isinstance(cred, api_key.Credentials) - assert cred.token == "api-key" diff --git a/tests/test_api_key.py b/tests/test_api_key.py deleted file mode 100644 index 9721731be..000000000 --- a/tests/test_api_key.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright 2021 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import pytest # type: ignore - -from google.auth import api_key - - -def test_credentials_constructor(): - with pytest.raises(ValueError) as excinfo: - api_key.Credentials("") - - assert excinfo.match(r"Token must be a non-empty API key string") - - -def test_expired_and_valid(): - credentials = api_key.Credentials("api-key") - - assert credentials.valid - assert credentials.token == "api-key" - assert not credentials.expired - - credentials.refresh(None) - assert credentials.valid - assert credentials.token == "api-key" - assert not credentials.expired - - -def test_before_request(): - credentials = api_key.Credentials("api-key") - headers = {} - - credentials.before_request(None, "http://example.com", "GET", headers) - assert headers["x-goog-api-key"] == "api-key" diff --git a/tests_async/test__default_async.py b/tests_async/test__default_async.py index 2a1921081..bf1a129a8 100644 --- a/tests_async/test__default_async.py +++ b/tests_async/test__default_async.py @@ -20,7 +20,6 @@ from google.auth import _credentials_async as credentials from google.auth import _default_async as _default -from google.auth import api_key from google.auth import app_engine from google.auth import compute_engine from google.auth import environment_vars @@ -562,46 +561,3 @@ def test_default_no_warning_with_quota_project_id_for_user_creds(get_adc_path): get_adc_path.return_value = test_default.AUTHORIZED_USER_CLOUD_SDK_FILE credentials, project_id = _default.default_async(quota_project_id="project-foo") - - -def test__get_api_key_credentials_no_env_var(): - cred, project_id = _default._get_api_key_credentials(quota_project_id="project-foo") - assert cred is None - assert project_id is None - - -def test__get_api_key_credentials_from_env_var(): - with mock.patch.dict(os.environ, {environment_vars.API_KEY: "api-key"}): - cred, project_id = _default._get_api_key_credentials( - quota_project_id="project-foo" - ) - assert isinstance(cred, api_key.Credentials) - assert cred.token == "api-key" - assert project_id == "project-foo" - - -def test_exception_with_api_key_and_adc_env_var(): - with mock.patch.dict(os.environ, {environment_vars.API_KEY: "api-key"}): - with mock.patch.dict( - os.environ, {environment_vars.CREDENTIALS: "/path/to/json"} - ): - with pytest.raises(exceptions.DefaultCredentialsError) as excinfo: - _default.default_async() - - assert excinfo.match( - r"GOOGLE_API_KEY and GOOGLE_APPLICATION_CREDENTIALS are mutually exclusive" - ) - - -def test_default_api_key_from_env_var(): - with mock.patch.dict(os.environ, {environment_vars.API_KEY: "api-key"}): - cred, project_id = _default.default_async() - assert isinstance(cred, api_key.Credentials) - assert cred.token == "api-key" - assert project_id is None - - -def test_get_api_key_credentials(): - cred = _default.get_api_key_credentials("api-key") - assert isinstance(cred, api_key.Credentials) - assert cred.token == "api-key" From 1442e6422aa2b42859332e2b0bd191077d83bbcf Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 31 Jan 2022 14:12:40 -0800 Subject: [PATCH 5/5] chore(main): release 2.6.0 (#965) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 12 ++++++++++++ google/auth/version.py | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9249639b0..377f02d3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,18 @@ [1]: https://pypi.org/project/google-auth/#history +## [2.6.0](https://github.com/googleapis/google-auth-library-python/compare/v2.5.0...v2.6.0) (2022-01-31) + + +### Features + +* ADC can load an impersonated service account credentials. ([#962](https://github.com/googleapis/google-auth-library-python/issues/962)) ([52c8ef9](https://github.com/googleapis/google-auth-library-python/commit/52c8ef90058120d7d04d3d201adc111664be526c)) + + +### Bug Fixes + +* revert "feat: add api key support ([#826](https://github.com/googleapis/google-auth-library-python/issues/826))" ([#964](https://github.com/googleapis/google-auth-library-python/issues/964)) ([f9f23f4](https://github.com/googleapis/google-auth-library-python/commit/f9f23f4370f2a7a5b2c66ee56a5e700ef03b5b06)) + ## [2.5.0](https://github.com/googleapis/google-auth-library-python/compare/v2.4.1...v2.5.0) (2022-01-25) diff --git a/google/auth/version.py b/google/auth/version.py index e6c150fc9..23427179e 100644 --- a/google/auth/version.py +++ b/google/auth/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.5.0" +__version__ = "2.6.0"