1616"""
1717
1818import json
19- from base64 import b64encode , b64decode , urlsafe_b64decode
20- from datetime import datetime
19+ import jwt
2120import random
22- import string
23- from jose import jwk
2421import requests
25- from requests .sessions import Session
2622import 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
3029from intuitlib .enums import Scopes
3130from intuitlib .exceptions import AuthClientError
32- from intuitlib . config import DISCOVERY_URL , ACCEPT_HEADER
31+
3332
3433def 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
174172def 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
191188def _correct_padding (val ):
192189 """Correct padding for JWT
0 commit comments