Skip to content

Commit eb87b72

Browse files
committed
further relegate single-argument decode_key_callback to legacy
1 parent 699ec4a commit eb87b72

File tree

3 files changed

+26
-8
lines changed

3 files changed

+26
-8
lines changed

flask_jwt_extended/default_callbacks.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ def default_verify_claims_failed_callback():
103103
return jsonify({config.error_msg_key: 'User claims verification failed'}), 400
104104

105105

106-
def default_decode_key_callback(claims):
106+
def default_decode_key_callback(claims, headers):
107107
"""
108108
By default, the decode key specified via the JWT_SECRET_KEY or
109109
JWT_PUBLIC_KEY settings will be used to decode all tokens

flask_jwt_extended/utils.py

Lines changed: 6 additions & 0 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 warnings import warn
34

45
try:
56
from flask import _app_ctx_stack as ctx_stack
@@ -82,6 +83,11 @@ def decode_token(encoded_token, csrf_value=None):
8283
try:
8384
secret = jwt_manager._decode_key_callback(unverified_claims, unverified_headers)
8485
except TypeError:
86+
msg = (
87+
"The single-argument (unverified_claims) form of decode_key_callback is deprecated. "
88+
"Update your code to use the two-argument form (unverified_claims, unverified_headers)."
89+
)
90+
warn(msg, DeprecationWarning)
8591
secret = jwt_manager._decode_key_callback(unverified_claims)
8692
return decode_jwt(
8793
encoded_token=encoded_token,

tests/test_decode_tokens.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import jwt
22
import pytest
33
from datetime import datetime, timedelta
4+
import warnings
45

56
from flask import Flask
67
from jwt import ExpiredSignatureError, InvalidSignatureError, InvalidAudienceError
@@ -136,25 +137,36 @@ def test_encode_decode_callback_values(app, default_access_token):
136137
jwtM = get_jwt_manager(app)
137138
app.config['JWT_SECRET_KEY'] = 'foobarbaz'
138139
with app.test_request_context():
139-
assert jwtM._decode_key_callback({}) == 'foobarbaz'
140+
assert jwtM._decode_key_callback({}, {}) == 'foobarbaz'
140141
assert jwtM._encode_key_callback({}) == 'foobarbaz'
141142

142143
@jwtM.encode_key_loader
143144
def get_encode_key_1(identity):
144145
return 'different secret'
145146
assert jwtM._encode_key_callback('') == 'different secret'
146147

147-
# test decode key callback with two arguments (preferred)
148148
@jwtM.decode_key_loader
149149
def get_decode_key_1(claims, headers):
150150
return 'different secret'
151151
assert jwtM._decode_key_callback({}, {}) == 'different secret'
152152

153+
154+
def test_legacy_decode_key_callback(app, default_access_token):
155+
jwtM = get_jwt_manager(app)
156+
app.config['JWT_SECRET_KEY'] = 'foobarbaz'
157+
153158
# test decode key callback with one argument (backwards compatibility)
154-
@jwtM.decode_key_loader
155-
def get_decode_key_2(claims):
156-
return 'different secret'
157-
assert jwtM._decode_key_callback({}) == 'different secret'
159+
with warnings.catch_warnings(record=True) as w:
160+
warnings.simplefilter("always")
161+
162+
@jwtM.decode_key_loader
163+
def get_decode_key_legacy(claims):
164+
return 'foobarbaz'
165+
with app.test_request_context():
166+
token = encode_token(app, default_access_token)
167+
decode_token(token)
168+
assert len(w) == 1
169+
assert issubclass(w[-1].category, DeprecationWarning)
158170

159171

160172
def test_custom_encode_decode_key_callbacks(app, default_access_token):
@@ -176,7 +188,7 @@ def get_encode_key_1(identity):
176188
decode_token(token)
177189

178190
@jwtM.decode_key_loader
179-
def get_decode_key_1(claims):
191+
def get_decode_key_1(claims, headers):
180192
assert claims['identity'] == 'username'
181193
return 'different secret'
182194

0 commit comments

Comments
 (0)