Skip to content

Commit 2a7353c

Browse files
authored
Merge pull request #139 from matthewstory/master
[#138] pass app json_encoder to jwt.encode
2 parents e1ab258 + a860550 commit 2a7353c

File tree

5 files changed

+28
-7
lines changed

5 files changed

+28
-7
lines changed

flask_jwt_extended/config.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,4 +240,8 @@ def user_claims_key(self):
240240
def exempt_methods(self):
241241
return {"OPTIONS"}
242242

243+
@property
244+
def json_encoder(self):
245+
return current_app.json_encoder
246+
243247
config = _Config()

flask_jwt_extended/jwt_manager.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@ def _create_refresh_token(self, identity, expires_delta=None):
379379
expires_delta=expires_delta,
380380
csrf=config.csrf_protect,
381381
identity_claim_key=config.identity_claim_key,
382+
json_encoder=config.json_encoder
382383
)
383384
return refresh_token
384385

@@ -395,7 +396,8 @@ def _create_access_token(self, identity, fresh=False, expires_delta=None):
395396
user_claims=self._user_claims_callback(identity),
396397
csrf=config.csrf_protect,
397398
identity_claim_key=config.identity_claim_key,
398-
user_claims_key=config.user_claims_key
399+
user_claims_key=config.user_claims_key,
400+
json_encoder=config.json_encoder
399401
)
400402
return access_token
401403

flask_jwt_extended/tokens.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ def _create_csrf_token():
1313
return str(uuid.uuid4())
1414

1515

16-
def _encode_jwt(additional_token_data, expires_delta, secret, algorithm):
16+
def _encode_jwt(additional_token_data, expires_delta, secret, algorithm,
17+
json_encoder=None):
1718
uid = str(uuid.uuid4())
1819
now = datetime.datetime.utcnow()
1920
token_data = {
@@ -31,7 +32,8 @@ def _encode_jwt(additional_token_data, expires_delta, secret, algorithm):
3132

3233

3334
def encode_access_token(identity, secret, algorithm, expires_delta, fresh,
34-
user_claims, csrf, identity_claim_key, user_claims_key):
35+
user_claims, csrf, identity_claim_key, user_claims_key,
36+
json_encoder=None):
3537
"""
3638
Creates a new encoded (utf-8) access token.
3739
@@ -70,11 +72,12 @@ def encode_access_token(identity, secret, algorithm, expires_delta, fresh,
7072

7173
if csrf:
7274
token_data['csrf'] = _create_csrf_token()
73-
return _encode_jwt(token_data, expires_delta, secret, algorithm)
75+
return _encode_jwt(token_data, expires_delta, secret, algorithm,
76+
json_encoder=json_encoder)
7477

7578

7679
def encode_refresh_token(identity, secret, algorithm, expires_delta, csrf,
77-
identity_claim_key):
80+
identity_claim_key, json_encoder=None):
7881
"""
7982
Creates a new encoded (utf-8) refresh token.
8083
@@ -95,7 +98,8 @@ def encode_refresh_token(identity, secret, algorithm, expires_delta, csrf,
9598
}
9699
if csrf:
97100
token_data['csrf'] = _create_csrf_token()
98-
return _encode_jwt(token_data, expires_delta, secret, algorithm)
101+
return _encode_jwt(token_data, expires_delta, secret, algorithm,
102+
json_encoder=json_encoder)
99103

100104

101105
def decode_jwt(encoded_token, secret, algorithm, identity_claim_key,

tests/test_config.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import pytest
44
from datetime import timedelta
55
from flask import Flask
6+
from flask.json import JSONEncoder
67

78
from flask_jwt_extended import JWTManager
89
from flask_jwt_extended.config import config
@@ -56,6 +57,8 @@ def test_default_configs(app):
5657
assert config.identity_claim_key == 'identity'
5758
assert config.user_claims_key == 'user_claims'
5859

60+
assert config.json_encoder is app.json_encoder
61+
5962

6063
def test_override_configs(app):
6164
app.config['JWT_TOKEN_LOCATION'] = ['cookies']
@@ -91,6 +94,11 @@ def test_override_configs(app):
9194
app.config['JWT_IDENTITY_CLAIM'] = 'foo'
9295
app.config['JWT_USER_CLAIMS'] = 'bar'
9396

97+
class CustomJSONEncoder(JSONEncoder):
98+
pass
99+
100+
app.json_encoder = CustomJSONEncoder
101+
94102
with app.test_request_context():
95103
assert config.token_location == ['cookies']
96104
assert config.jwt_in_cookies is True
@@ -131,6 +139,8 @@ def test_override_configs(app):
131139
assert config.identity_claim_key == 'foo'
132140
assert config.user_claims_key == 'bar'
133141

142+
assert config.json_encoder is CustomJSONEncoder
143+
134144

135145
def test_tokens_never_expire(app):
136146
app.config['JWT_ACCESS_TOKEN_EXPIRES'] = False

tests/utils.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ def encode_token(app, token_data):
88
token = jwt.encode(
99
token_data,
1010
config.decode_key,
11-
algorithm=config.algorithm
11+
algorithm=config.algorithm,
12+
json_encoder=config.json_encoder
1213
)
1314
return token.decode('utf-8')
1415

0 commit comments

Comments
 (0)