33from calendar import timegm
44
55from werkzeug .exceptions import BadRequest
6+ from jwt import ExpiredSignatureError
67
78from flask import request
89try :
@@ -191,7 +192,7 @@ def _decode_jwt_from_headers():
191192 raise InvalidHeaderError (msg )
192193 encoded_token = parts [1 ]
193194
194- return decode_token ( encoded_token )
195+ return encoded_token , None
195196
196197
197198def _decode_jwt_from_cookies (request_type ):
@@ -213,7 +214,7 @@ def _decode_jwt_from_cookies(request_type):
213214 else :
214215 csrf_value = None
215216
216- return decode_token ( encoded_token , csrf_value = csrf_value )
217+ return encoded_token , csrf_value
217218
218219
219220def _decode_jwt_from_query_string ():
@@ -222,7 +223,7 @@ def _decode_jwt_from_query_string():
222223 if not encoded_token :
223224 raise NoAuthorizationError ('Missing "{}" query paramater' .format (query_param ))
224225
225- return decode_token ( encoded_token )
226+ return encoded_token , None
226227
227228
228229def _decode_jwt_from_json (request_type ):
@@ -241,29 +242,35 @@ def _decode_jwt_from_json(request_type):
241242 except BadRequest :
242243 raise NoAuthorizationError ('Missing "{}" key in json data.' .format (token_key ))
243244
244- return decode_token ( encoded_token )
245+ return encoded_token , None
245246
246247
247248def _decode_jwt_from_request (request_type ):
248249 # All the places we can get a JWT from in this request
249- decode_functions = []
250+ get_encoded_token_functions = []
250251 if config .jwt_in_cookies :
251- decode_functions .append (lambda : _decode_jwt_from_cookies (request_type ))
252+ get_encoded_token_functions .append (lambda : _decode_jwt_from_cookies (request_type ))
252253 if config .jwt_in_query_string :
253- decode_functions .append (_decode_jwt_from_query_string )
254+ get_encoded_token_functions .append (_decode_jwt_from_query_string )
254255 if config .jwt_in_headers :
255- decode_functions .append (_decode_jwt_from_headers )
256+ get_encoded_token_functions .append (_decode_jwt_from_headers )
256257 if config .jwt_in_json :
257- decode_functions .append (lambda : _decode_jwt_from_json (request_type ))
258+ get_encoded_token_functions .append (lambda : _decode_jwt_from_json (request_type ))
258259
259260 # Try to find the token from one of these locations. It only needs to exist
260261 # in one place to be valid (not every location).
261262 errors = []
262263 decoded_token = None
263- for decode_function in decode_functions :
264+ for get_encoded_token_function in get_encoded_token_functions :
264265 try :
265- decoded_token = decode_function ()
266+ encoded_token , csrf_token = get_encoded_token_function ()
267+ decoded_token = decode_token (encoded_token , csrf_token )
266268 break
269+ except ExpiredSignatureError :
270+ # Save the expired token so we can access it in a callback later
271+ expired_data = decode_token (encoded_token , csrf_token , allow_expired = True )
272+ ctx_stack .top .expired_jwt = expired_data
273+ raise
267274 except NoAuthorizationError as e :
268275 errors .append (str (e ))
269276
0 commit comments