Skip to content

Commit 67de379

Browse files
committed
Fix expired token callback using decode_token()
Refs #234
1 parent af1143b commit 67de379

File tree

3 files changed

+49
-18
lines changed

3 files changed

+49
-18
lines changed

flask_jwt_extended/utils.py

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from flask import current_app
22
from werkzeug.local import LocalProxy
3+
from jwt import ExpiredSignatureError
34
from warnings import warn
45

56
try:
@@ -93,17 +94,32 @@ def decode_token(encoded_token, csrf_value=None, allow_expired=False):
9394
warn(msg, DeprecationWarning)
9495
secret = jwt_manager._decode_key_callback(unverified_claims)
9596

96-
return decode_jwt(
97-
encoded_token=encoded_token,
98-
secret=secret,
99-
algorithm=config.algorithm,
100-
identity_claim_key=config.identity_claim_key,
101-
user_claims_key=config.user_claims_key,
102-
csrf_value=csrf_value,
103-
audience=config.audience,
104-
leeway=config.leeway,
105-
allow_expired=allow_expired
106-
)
97+
try:
98+
return decode_jwt(
99+
encoded_token=encoded_token,
100+
secret=secret,
101+
algorithm=config.algorithm,
102+
identity_claim_key=config.identity_claim_key,
103+
user_claims_key=config.user_claims_key,
104+
csrf_value=csrf_value,
105+
audience=config.audience,
106+
leeway=config.leeway,
107+
allow_expired=allow_expired
108+
)
109+
except ExpiredSignatureError:
110+
expired_token = decode_jwt(
111+
encoded_token=encoded_token,
112+
secret=secret,
113+
algorithm=config.algorithm,
114+
identity_claim_key=config.identity_claim_key,
115+
user_claims_key=config.user_claims_key,
116+
csrf_value=csrf_value,
117+
audience=config.audience,
118+
leeway=config.leeway,
119+
allow_expired=True
120+
)
121+
ctx_stack.top.expired_jwt = expired_token
122+
raise
107123

108124

109125
def _get_jwt_manager():

flask_jwt_extended/view_decorators.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from calendar import timegm
44

55
from werkzeug.exceptions import BadRequest
6-
from jwt import ExpiredSignatureError
76

87
from flask import request
98
try:
@@ -266,11 +265,6 @@ def _decode_jwt_from_request(request_type):
266265
encoded_token, csrf_token = get_encoded_token_function()
267266
decoded_token = decode_token(encoded_token, csrf_token)
268267
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
274268
except NoAuthorizationError as e:
275269
errors.append(str(e))
276270

tests/test_view_decorators.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66

77
from flask_jwt_extended import (
88
jwt_required, fresh_jwt_required, JWTManager, jwt_refresh_token_required,
9-
jwt_optional, create_access_token, create_refresh_token, get_jwt_identity
9+
jwt_optional, create_access_token, create_refresh_token, get_jwt_identity,
10+
decode_token
1011
)
1112
from tests.utils import make_headers, encode_token, get_jwt_manager
1213

@@ -277,6 +278,26 @@ def custom_response(token):
277278
assert len(w) == 0
278279

279280

281+
def test_expired_token_via_decode_token(app):
282+
jwtM = get_jwt_manager(app)
283+
284+
@jwtM.expired_token_loader
285+
def depreciated_custom_response(expired_token):
286+
assert expired_token['identity'] == 'username'
287+
return jsonify(msg='foobar'), 401
288+
289+
@app.route('/test')
290+
def test_route():
291+
token = create_access_token('username', expires_delta=timedelta(minutes=-1))
292+
decode_token(token)
293+
return jsonify(msg='baz'), 200
294+
295+
test_client = app.test_client()
296+
response = test_client.get('/test')
297+
assert response.get_json() == {'msg': 'foobar'}
298+
assert response.status_code == 401
299+
300+
280301
def test_no_token(app):
281302
url = '/protected'
282303
jwtM = get_jwt_manager(app)

0 commit comments

Comments
 (0)