Skip to content

Commit 75c78b2

Browse files
author
Jon Wayne Parrott
authored
Add service_account.Credentials.with_claims (#140)
1 parent d47281b commit 75c78b2

File tree

3 files changed

+33
-2
lines changed

3 files changed

+33
-2
lines changed

google/auth/jwt.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242

4343
import base64
4444
import collections
45+
import copy
4546
import datetime
4647
import json
4748

@@ -426,13 +427,15 @@ def with_claims(self, issuer=None, subject=None, audience=None,
426427
Returns:
427428
google.auth.jwt.Credentials: A new credentials instance.
428429
"""
430+
new_additional_claims = copy.deepcopy(self._additional_claims)
431+
new_additional_claims.update(additional_claims or {})
432+
429433
return Credentials(
430434
self._signer,
431435
issuer=issuer if issuer is not None else self._issuer,
432436
subject=subject if subject is not None else self._subject,
433437
audience=audience if audience is not None else self._audience,
434-
additional_claims=self._additional_claims.copy().update(
435-
additional_claims or {}))
438+
additional_claims=new_additional_claims)
436439

437440
def _make_jwt(self):
438441
"""Make a signed JWT.

google/oauth2/service_account.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
.. _RFC 7523: https://tools.ietf.org/html/rfc7523
7171
"""
7272

73+
import copy
7374
import datetime
7475

7576
from google.auth import _helpers
@@ -246,6 +247,29 @@ def with_subject(self, subject):
246247
subject=subject,
247248
additional_claims=self._additional_claims.copy())
248249

250+
def with_claims(self, additional_claims):
251+
"""Returns a copy of these credentials with modified claims.
252+
253+
Args:
254+
additional_claims (Mapping[str, str]): Any additional claims for
255+
the JWT payload. This will be merged with the current
256+
additional claims.
257+
258+
Returns:
259+
google.auth.service_account.Credentials: A new credentials
260+
instance.
261+
"""
262+
new_additional_claims = copy.deepcopy(self._additional_claims)
263+
new_additional_claims.update(additional_claims or {})
264+
265+
return Credentials(
266+
self._signer,
267+
service_account_email=self._service_account_email,
268+
scopes=self._scopes,
269+
token_uri=self._token_uri,
270+
subject=self._subject,
271+
additional_claims=new_additional_claims)
272+
249273
def _make_authorization_grant_assertion(self):
250274
"""Create the OAuth 2.0 assertion.
251275

tests/oauth2/test_service_account.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,10 @@ def test_create_scoped(self):
134134
credentials = self.credentials.with_scopes(scopes)
135135
assert credentials._scopes == scopes
136136

137+
def test_with_claims(self):
138+
new_credentials = self.credentials.with_claims({'meep': 'moop'})
139+
assert new_credentials._additional_claims == {'meep': 'moop'}
140+
137141
def test__make_authorization_grant_assertion(self):
138142
token = self.credentials._make_authorization_grant_assertion()
139143
payload = jwt.decode(token, PUBLIC_CERT_BYTES)

0 commit comments

Comments
 (0)