Skip to content

Commit f7f2792

Browse files
committed
Refactor audience checking in crypt.verify_signed_jwt_with_certs.
Moved check into protected function _check_audience.
1 parent fc2d063 commit f7f2792

File tree

2 files changed

+52
-9
lines changed

2 files changed

+52
-9
lines changed

oauth2client/crypt.py

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,29 @@ def _verify_signature(message, signature, certs):
119119
raise AppIdentityError('Invalid token signature')
120120

121121

122-
def verify_signed_jwt_with_certs(jwt, certs, audience):
122+
def _check_audience(payload_dict, audience):
123+
"""Checks audience field from a JWT payload.
124+
125+
Does nothing if the passed in ``audience`` is null.
126+
127+
Args:
128+
payload_dict: dict, A dictionary containing a JWT payload.
129+
audience: string or NoneType, an audience to check for in
130+
the JWT payload.
131+
"""
132+
if audience is None:
133+
return
134+
135+
audience_in_payload = payload_dict.get('aud')
136+
if audience_in_payload is None:
137+
raise AppIdentityError('No aud field in token: %s' %
138+
(payload_dict,))
139+
if audience_in_payload != audience:
140+
raise AppIdentityError('Wrong recipient, %s != %s: %s' %
141+
(audience_in_payload, audience, payload_dict))
142+
143+
144+
def verify_signed_jwt_with_certs(jwt, certs, audience=None):
123145
"""Verify a JWT against public certs.
124146
125147
See http://self-issued.info/docs/draft-jones-json-web-token.html.
@@ -180,13 +202,6 @@ def verify_signed_jwt_with_certs(jwt, certs, audience):
180202
(now, latest, payload_bytes))
181203

182204
# Check audience.
183-
if audience is not None:
184-
aud = payload_dict.get('aud')
185-
if aud is None:
186-
raise AppIdentityError('No aud field in token: %s' %
187-
(payload_bytes,))
188-
if aud != audience:
189-
raise AppIdentityError('Wrong recipient, %s != %s: %s' %
190-
(aud, audience, payload_bytes))
205+
_check_audience(payload_dict, audience)
191206

192207
return payload_dict

tests/test_crypt.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,34 @@ def test_failure(self):
148148
verifier.verify.assert_called_once_with(message, signature)
149149

150150

151+
class Test__check_audience(unittest.TestCase):
152+
153+
def test_null_audience(self):
154+
result = crypt._check_audience(None, None)
155+
self.assertEqual(result, None)
156+
157+
def test_success(self):
158+
audience = 'audience'
159+
payload_dict = {'aud': audience}
160+
result = crypt._check_audience(payload_dict, audience)
161+
# No exception and no result.
162+
self.assertEqual(result, None)
163+
164+
def test_missing_aud(self):
165+
audience = 'audience'
166+
payload_dict = {}
167+
self.assertRaises(crypt.AppIdentityError, crypt._check_audience,
168+
payload_dict, audience)
169+
170+
def test_wrong_aud(self):
171+
audience1 = 'audience1'
172+
audience2 = 'audience2'
173+
self.assertNotEqual(audience1, audience2)
174+
payload_dict = {'aud': audience1}
175+
self.assertRaises(crypt.AppIdentityError, crypt._check_audience,
176+
payload_dict, audience2)
177+
178+
151179
class _MockOrderedDict(object):
152180

153181
def __init__(self, *values):

0 commit comments

Comments
 (0)