Skip to content

Commit dfac15b

Browse files
Feat: Client should pass client_options.api_key to auth library (#321)
* Feat: Client should pass client_options.api_key to auth library * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * bump auth requirement * bump api core requirement * bump requirements yet again * only enable feature if auth library has support * fix bare except lint issue * add skipped files * add skipped files again --------- Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
1 parent 9cd5dd4 commit dfac15b

File tree

3 files changed

+67
-21
lines changed

3 files changed

+67
-21
lines changed

.kokoro/docker/docs/requirements.txt

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ argcomplete==3.5.3 \
88
--hash=sha256:2ab2c4a215c59fd6caaff41a869480a23e8f6a5f910b266c1808037f4e375b61 \
99
--hash=sha256:c12bf50eded8aebb298c7b7da7a5ff3ee24dffd9f5281867dfe1424b58c55392
1010
# via nox
11-
cachetools==5.5.1 \
12-
--hash=sha256:70f238fbba50383ef62e55c6aff6d9673175fe59f7c6782c7a0b9e38f4a9df95 \
13-
--hash=sha256:b76651fdc3b24ead3c648bbdeeb940c1b04d365b38b4af66788f9ec4a81d42bb
11+
cachetools==5.5.0 \
12+
--hash=sha256:02134e8439cdc2ffb62023ce1debca2944c3f289d66bb17ead3ab3dede74b292 \
13+
--hash=sha256:2cc24fb4cbe39633fb7badd9db9ca6295d766d9c2995f245725a46715d050f2a
1414
# via google-auth
1515
certifi==2024.12.14 \
1616
--hash=sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56 \
@@ -124,23 +124,23 @@ distlib==0.3.9 \
124124
--hash=sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87 \
125125
--hash=sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403
126126
# via virtualenv
127-
filelock==3.17.0 \
128-
--hash=sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338 \
129-
--hash=sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e
127+
filelock==3.16.1 \
128+
--hash=sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0 \
129+
--hash=sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435
130130
# via virtualenv
131131
gcp-docuploader==0.6.5 \
132132
--hash=sha256:30221d4ac3e5a2b9c69aa52fdbef68cc3f27d0e6d0d90e220fc024584b8d2318 \
133133
--hash=sha256:b7458ef93f605b9d46a4bf3a8dc1755dad1f31d030c8679edf304e343b347eea
134134
# via -r requirements.in
135-
google-api-core==2.24.1 \
136-
--hash=sha256:bc78d608f5a5bf853b80bd70a795f703294de656c096c0968320830a4bc280f1 \
137-
--hash=sha256:f8b36f5456ab0dd99a1b693a40a31d1e7757beea380ad1b38faaf8941eae9d8a
135+
google-api-core==2.24.0 \
136+
--hash=sha256:10d82ac0fca69c82a25b3efdeefccf6f28e02ebb97925a8cce8edbfe379929d9 \
137+
--hash=sha256:e255640547a597a4da010876d333208ddac417d60add22b6851a0c66a831fcaf
138138
# via
139139
# google-cloud-core
140140
# google-cloud-storage
141-
google-auth==2.38.0 \
142-
--hash=sha256:8285113607d3b80a3f1543b75962447ba8a09fe85783432a784fdeef6ac094c4 \
143-
--hash=sha256:e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a
141+
google-auth==2.37.0 \
142+
--hash=sha256:0054623abf1f9c83492c63d3f47e77f0a544caa3d40b2d98e099a611c2dd5d00 \
143+
--hash=sha256:42664f18290a6be591be5329a96fe30184be1a1badb7292a7f686a9659de9ca0
144144
# via
145145
# google-api-core
146146
# google-cloud-core
@@ -149,9 +149,9 @@ google-cloud-core==2.4.1 \
149149
--hash=sha256:9b7749272a812bde58fff28868d0c5e2f585b82f37e09a1f6ed2d4d10f134073 \
150150
--hash=sha256:a9e6a4422b9ac5c29f79a0ede9485473338e2ce78d91f2370c01e730eab22e61
151151
# via google-cloud-storage
152-
google-cloud-storage==3.0.0 \
153-
--hash=sha256:2accb3e828e584888beff1165e5f3ac61aa9088965eb0165794a82d8c7f95297 \
154-
--hash=sha256:f85fd059650d2dbb0ac158a9a6b304b66143b35ed2419afec2905ca522eb2c6a
152+
google-cloud-storage==2.19.0 \
153+
--hash=sha256:aeb971b5c29cf8ab98445082cbfe7b161a1f48ed275822f59ed3f1524ea54fba \
154+
--hash=sha256:cd05e9e7191ba6cb68934d8eb76054d9be4562aa89dbc4236feee4d7d51342b2
155155
# via gcp-docuploader
156156
google-crc32c==1.6.0 \
157157
--hash=sha256:05e2d8c9a2f853ff116db9706b4a27350587f341eda835f46db3c0a8c8ce2f24 \
@@ -208,9 +208,9 @@ platformdirs==4.3.6 \
208208
--hash=sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907 \
209209
--hash=sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb
210210
# via virtualenv
211-
proto-plus==1.26.0 \
212-
--hash=sha256:6e93d5f5ca267b54300880fff156b6a3386b3fa3f43b1da62e680fc0c586ef22 \
213-
--hash=sha256:bf2dfaa3da281fc3187d12d224c707cb57214fb2c22ba854eb0c105a3fb2d4d7
211+
proto-plus==1.25.0 \
212+
--hash=sha256:c91fc4a65074ade8e458e95ef8bac34d4008daa7cce4a12d6707066fca648961 \
213+
--hash=sha256:fbb17f57f7bd05a68b7707e745e26528b0b3c34e378db91eef93912c54982d91
214214
# via google-api-core
215215
protobuf==5.29.3 \
216216
--hash=sha256:0a18ed4a24198528f2333802eb075e59dea9d679ab7a6c5efb017a59004d849f \
@@ -291,7 +291,7 @@ urllib3==2.3.0 \
291291
--hash=sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df \
292292
--hash=sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d
293293
# via requests
294-
virtualenv==20.29.1 \
295-
--hash=sha256:4e4cb403c0b0da39e13b46b1b2476e505cb0046b25f242bee80f62bf990b2779 \
296-
--hash=sha256:b8b8970138d32fb606192cb97f6cd4bb644fa486be9308fb9b63f81091b5dc35
294+
virtualenv==20.28.1 \
295+
--hash=sha256:412773c85d4dab0409b83ec36f7a6499e72eaf08c80e81e9576bca61831c71cb \
296+
--hash=sha256:5d34ab240fdb5d21549b76f9e8ff3af28252f5499fb6d6f031adac4e5a8c5329
297297
# via nox

google/cloud/client/__init__.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,13 @@
3030
from google.cloud._helpers import _determine_default_project
3131
from google.oauth2 import service_account
3232

33+
try:
34+
import google.auth.api_key
35+
36+
HAS_GOOGLE_AUTH_API_KEY = True
37+
except ImportError:
38+
HAS_GOOGLE_AUTH_API_KEY = False
39+
3340

3441
_GOOGLE_AUTH_CREDENTIALS_HELP = (
3542
"This library only supports credentials from google-auth-library-python. "
@@ -161,6 +168,15 @@ def __init__(self, credentials=None, _http=None, client_options=None):
161168
"'credentials' and 'client_options.credentials_file' are mutually exclusive."
162169
)
163170

171+
if (
172+
HAS_GOOGLE_AUTH_API_KEY
173+
and client_options.api_key
174+
and (credentials or client_options.credentials_file)
175+
):
176+
raise google.api_core.exceptions.DuplicateCredentialArgs(
177+
"'client_options.api_key' is mutually exclusive with 'credentials' and 'client_options.credentials_file'."
178+
)
179+
164180
if credentials and not isinstance(
165181
credentials, google.auth.credentials.Credentials
166182
):
@@ -174,6 +190,8 @@ def __init__(self, credentials=None, _http=None, client_options=None):
174190
credentials, _ = google.auth.load_credentials_from_file(
175191
client_options.credentials_file, scopes=scopes
176192
)
193+
elif HAS_GOOGLE_AUTH_API_KEY and client_options.api_key is not None:
194+
credentials = google.auth.api_key.Credentials(client_options.api_key)
177195
else:
178196
credentials, _ = google.auth.default(scopes=scopes)
179197

tests/unit/test_client.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import unittest
1818
from unittest import mock
1919

20+
from google.cloud.client import HAS_GOOGLE_AUTH_API_KEY
21+
2022

2123
def _make_credentials():
2224
import google.auth.credentials
@@ -75,6 +77,19 @@ def test_ctor_explicit(self):
7577
self.assertIs(client_obj._credentials, credentials)
7678
self.assertIs(client_obj._http_internal, http)
7779

80+
@unittest.skipIf(
81+
not HAS_GOOGLE_AUTH_API_KEY, "Auth library version does not support API keys"
82+
)
83+
def test_ctor_client_options_w_api_key(self):
84+
from google.auth.api_key import Credentials
85+
86+
API_KEY = "my_api_key"
87+
88+
client_options = {"api_key": API_KEY}
89+
client_obj = self._make_one(client_options=client_options)
90+
91+
self.assertIsInstance(client_obj._credentials, Credentials)
92+
7893
def test_ctor_client_options_w_conflicting_creds(self):
7994
from google.api_core.exceptions import DuplicateCredentialArgs
8095

@@ -83,6 +98,19 @@ def test_ctor_client_options_w_conflicting_creds(self):
8398
with self.assertRaises(DuplicateCredentialArgs):
8499
self._make_one(credentials=credentials, client_options=client_options)
85100

101+
@unittest.skipIf(
102+
not HAS_GOOGLE_AUTH_API_KEY, "Auth library version does not support API keys"
103+
)
104+
def test_ctor_client_options_w_api_key_and_conflicting_creds(self):
105+
from google.api_core.exceptions import DuplicateCredentialArgs
106+
107+
API_KEY = "my_api_key"
108+
109+
credentials = _make_credentials()
110+
client_options = {"api_key": API_KEY}
111+
with self.assertRaises(DuplicateCredentialArgs):
112+
self._make_one(credentials=credentials, client_options=client_options)
113+
86114
def test_ctor_bad_credentials(self):
87115
credentials = mock.sentinel.credentials
88116

0 commit comments

Comments
 (0)