Skip to content

Commit aa073eb

Browse files
committed
Gracefully handle malformed tokens
Closes #246
1 parent 05a802a commit aa073eb

File tree

3 files changed

+24
-4
lines changed

3 files changed

+24
-4
lines changed

flask_jwt_extended/jwt_manager.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from jwt import (
55
ExpiredSignatureError, InvalidTokenError, InvalidAudienceError,
6-
InvalidIssuerError
6+
InvalidIssuerError, DecodeError
77
)
88
try:
99
from flask import _app_ctx_stack as ctx_stack
@@ -113,6 +113,10 @@ def handle_expired_error(e):
113113
def handle_invalid_header_error(e):
114114
return self._invalid_token_callback(str(e))
115115

116+
@app.errorhandler(DecodeError)
117+
def handle_invalid_header_error(e):
118+
return self._invalid_token_callback(str(e))
119+
116120
@app.errorhandler(InvalidTokenError)
117121
def handle_invalid_token_error(e):
118122
return self._invalid_token_callback(str(e))

tests/test_decode_tokens.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
from jwt import (
1010
ExpiredSignatureError, InvalidSignatureError, InvalidAudienceError,
11-
ImmatureSignatureError, InvalidIssuerError
11+
ImmatureSignatureError, InvalidIssuerError, DecodeError
1212
)
1313

1414
from flask_jwt_extended import (
@@ -279,3 +279,10 @@ def test_invalid_iss(app, default_access_token):
279279
with pytest.raises(InvalidIssuerError):
280280
with app.test_request_context():
281281
decode_token(invalid_token)
282+
283+
284+
def test_malformed_token(app):
285+
invalid_token = 'foobarbaz'
286+
with pytest.raises(DecodeError):
287+
with app.test_request_context():
288+
decode_token(invalid_token)

tests/test_view_decorators.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,6 @@ def test_jwt_missing_claims(app):
216216

217217
def test_jwt_invalid_audience(app):
218218
url = '/protected'
219-
jwtM = get_jwt_manager(app)
220219
test_client = app.test_client()
221220

222221
# No audience claim expected or provided - OK
@@ -237,9 +236,9 @@ def test_jwt_invalid_audience(app):
237236
assert response.status_code == 422
238237
assert response.get_json() == {'msg': 'Invalid audience'}
239238

239+
240240
def test_jwt_invalid_issuer(app):
241241
url = '/protected'
242-
jwtM = get_jwt_manager(app)
243242
test_client = app.test_client()
244243

245244
# No issuer claim expected or provided - OK
@@ -261,6 +260,16 @@ def test_jwt_invalid_issuer(app):
261260
assert response.get_json() == {'msg': 'Invalid issuer'}
262261

263262

263+
def test_malformed_token(app):
264+
url = '/protected'
265+
test_client = app.test_client()
266+
267+
access_token = 'foobarbaz'
268+
response = test_client.get(url, headers=make_headers(access_token))
269+
assert response.status_code == 422
270+
assert response.get_json() == {'msg': 'Not enough segments'}
271+
272+
264273
@pytest.mark.parametrize("delta_func", [timedelta, relativedelta])
265274
def test_expired_token(app, delta_func):
266275
url = '/protected'

0 commit comments

Comments
 (0)