Skip to content

Commit 451deee

Browse files
authored
Merge pull request #49 from SilvrGroup/use-pyjwt
Use PyJWT instead of python-jose
2 parents 8cefee7 + 9cb5d87 commit 451deee

File tree

3 files changed

+17
-20
lines changed

3 files changed

+17
-20
lines changed

intuitlib/utils.py

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,19 @@
1616
"""
1717

1818
import json
19-
from base64 import b64encode, b64decode, urlsafe_b64decode
20-
from datetime import datetime
19+
import jwt
2120
import random
22-
import string
23-
from jose import jwk
2421
import requests
25-
from requests.sessions import Session
2622
import six
27-
from requests_oauthlib import OAuth1
28-
23+
import string
24+
from base64 import b64encode, b64decode, urlsafe_b64decode
25+
from datetime import datetime
26+
from requests.sessions import Session
2927

28+
from intuitlib.config import DISCOVERY_URL, ACCEPT_HEADER
3029
from intuitlib.enums import Scopes
3130
from intuitlib.exceptions import AuthClientError
32-
from intuitlib.config import DISCOVERY_URL, ACCEPT_HEADER
31+
3332

3433
def get_discovery_doc(environment, session=None):
3534
"""Gets discovery doc based on environment specified.
@@ -153,7 +152,6 @@ def validate_id_token(id_token, client_id, intuit_issuer, jwk_uri):
153152

154153
id_token_header = json.loads(b64decode(_correct_padding(id_token_parts[0])).decode('ascii'))
155154
id_token_payload = json.loads(b64decode(_correct_padding(id_token_parts[1])).decode('ascii'))
156-
id_token_signature = urlsafe_b64decode(((_correct_padding(id_token_parts[2])).encode('ascii')))
157155

158156
if id_token_payload['iss'] != intuit_issuer:
159157
return False
@@ -164,12 +162,12 @@ def validate_id_token(id_token, client_id, intuit_issuer, jwk_uri):
164162
if id_token_payload['exp'] < current_time:
165163
return False
166164

167-
message = id_token_parts[0] + '.' + id_token_parts[1]
168-
keys_dict = get_jwk(id_token_header['kid'], jwk_uri)
169-
170-
public_key = jwk.construct(keys_dict)
171-
is_signature_valid = public_key.verify(message.encode('utf-8'), id_token_signature)
172-
return is_signature_valid
165+
public_key = get_jwk(id_token_header['kid'], jwk_uri).key
166+
try:
167+
jwt.decode(id_token, public_key, audience=client_id, algorithms=['RS256'])
168+
return True
169+
except jwt.PyJWTError:
170+
return False
173171

174172
def get_jwk(kid, jwk_uri):
175173
"""Get JWK for public key information
@@ -178,15 +176,14 @@ def get_jwk(kid, jwk_uri):
178176
:param jwk_uri: JWK URI
179177
180178
:raises HTTPError: if response status != 200
181-
:return: dict containing keys
179+
:return: Algorithm with the key loaded.
182180
"""
183181

184182
response = requests.get(jwk_uri)
185183
if response.status_code != 200:
186184
raise AuthClientError(response)
187185
data = response.json()
188-
keys = next(key for key in data["keys"] if key['kid'] == kid)
189-
return keys
186+
return jwt.PyJWKSet.from_dict(data)[kid]
190187

191188
def _correct_padding(val):
192189
"""Correct padding for JWT

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
python_jose>=2.0.2
21
requests>=2.13.0
32
mock>=2.0.0
43
requests_oauthlib>=1.0.0
@@ -8,3 +7,4 @@ pytest>=3.8.0
87
pytest-cov==2.5.0
98
six>=1.10.0
109
enum-compat
10+
pyjwt[crypto]>=2.0.0

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
packages=find_packages(exclude=('tests*',)),
3131
namespace_packages=('intuitlib',),
3232
install_requires=[
33-
'python_jose>=2.0.2',
33+
'pyjwt[crypto]>=2.0.0',
3434
'requests>=2.13.0',
3535
'requests_oauthlib>=1.0.0',
3636
'six>=1.10.0',

0 commit comments

Comments
 (0)