Skip to content

Commit 5bd8b1e

Browse files
authored
Introduce new Config JWT_ENCODE_ISSUER (#330)
This value will populate the claim `iss` if set.
1 parent bf1a521 commit 5bd8b1e

File tree

6 files changed

+44
-7
lines changed

6 files changed

+44
-7
lines changed

flask_jwt_extended/config.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,11 @@ def audience(self):
329329
return current_app.config['JWT_DECODE_AUDIENCE']
330330

331331
@property
332-
def issuer(self):
332+
def encode_issuer(self):
333+
return current_app.config['JWT_ENCODE_ISSUER']
334+
335+
@property
336+
def decode_issuer(self):
333337
return current_app.config['JWT_DECODE_ISSUER']
334338

335339
@property

flask_jwt_extended/jwt_manager.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ def _set_default_configuration_options(app):
230230
app.config.setdefault('JWT_IDENTITY_CLAIM', 'identity')
231231
app.config.setdefault('JWT_USER_CLAIMS', 'user_claims')
232232
app.config.setdefault('JWT_DECODE_AUDIENCE', None)
233+
app.config.setdefault('JWT_ENCODE_ISSUER', None)
233234
app.config.setdefault('JWT_DECODE_ISSUER', None)
234235
app.config.setdefault('JWT_DECODE_LEEWAY', 0)
235236

@@ -519,6 +520,7 @@ def _create_access_token(self, identity, fresh=False, expires_delta=None,
519520
identity_claim_key=config.identity_claim_key,
520521
user_claims_key=config.user_claims_key,
521522
json_encoder=config.json_encoder,
522-
headers=headers
523+
headers=headers,
524+
issuer=config.encode_issuer,
523525
)
524526
return access_token

flask_jwt_extended/tokens.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def _encode_jwt(additional_token_data, expires_delta, secret, algorithm,
3333

3434
def encode_access_token(identity, secret, algorithm, expires_delta, fresh,
3535
user_claims, csrf, identity_claim_key, user_claims_key,
36-
json_encoder=None, headers=None):
36+
json_encoder=None, headers=None, issuer=None):
3737
"""
3838
Creates a new encoded (utf-8) access token.
3939
@@ -54,6 +54,7 @@ def encode_access_token(identity, secret, algorithm, expires_delta, fresh,
5454
:param identity_claim_key: Which key should be used to store the identity
5555
:param user_claims_key: Which key should be used to store the user claims
5656
:param headers: valid dict for specifying additional headers in JWT header section
57+
:param issuer: Issuer value configured as JWT_ENCODE_ISSUER
5758
:return: Encoded access token
5859
"""
5960

@@ -73,6 +74,8 @@ def encode_access_token(identity, secret, algorithm, expires_delta, fresh,
7374

7475
if csrf:
7576
token_data['csrf'] = _create_csrf_token()
77+
if issuer is not None:
78+
token_data['iss'] = issuer
7679
return _encode_jwt(token_data, expires_delta, secret, algorithm,
7780
json_encoder=json_encoder, headers=headers)
7881

flask_jwt_extended/utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ def decode_token(encoded_token, csrf_value=None, allow_expired=False):
113113
user_claims_key=config.user_claims_key,
114114
csrf_value=csrf_value,
115115
audience=config.audience,
116-
issuer=config.issuer,
116+
issuer=config.decode_issuer,
117117
leeway=config.leeway,
118118
allow_expired=allow_expired
119119
)
@@ -126,7 +126,7 @@ def decode_token(encoded_token, csrf_value=None, allow_expired=False):
126126
user_claims_key=config.user_claims_key,
127127
csrf_value=csrf_value,
128128
audience=config.audience,
129-
issuer=config.issuer,
129+
issuer=config.decode_issuer,
130130
leeway=config.leeway,
131131
allow_expired=True
132132
)

tests/test_config.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ def test_default_configs(app):
7272
assert config.json_encoder is app.json_encoder
7373

7474
assert config.error_msg_key == 'msg'
75+
assert config.encode_issuer is None
76+
assert config.decode_issuer is None
7577

7678

7779
@pytest.mark.parametrize("delta_func", [timedelta, relativedelta])
@@ -117,6 +119,8 @@ def test_override_configs(app, delta_func):
117119
app.config['JWT_CLAIMS_IN_REFRESH_TOKEN'] = True
118120

119121
app.config['JWT_ERROR_MESSAGE_KEY'] = 'message'
122+
app.config['JWT_ENCODE_ISSUER'] = 'fje'
123+
app.config['JWT_DECODE_ISSUER'] = 'fje'
120124

121125
class CustomJSONEncoder(JSONEncoder):
122126
pass
@@ -175,6 +179,8 @@ class CustomJSONEncoder(JSONEncoder):
175179
assert config.json_encoder is CustomJSONEncoder
176180

177181
assert config.error_msg_key == 'message'
182+
assert config.encode_issuer == 'fje'
183+
assert config.decode_issuer == 'fje'
178184

179185

180186
def test_tokens_never_expire(app):

tests/test_decode_tokens.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,27 @@ def test_invalid_aud(app, default_access_token, token_aud):
262262
with app.test_request_context():
263263
decode_token(invalid_token)
264264

265-
def test_valid_iss(app, default_access_token):
265+
266+
def test_encode_iss(app, default_access_token):
267+
app.config['JWT_ENCODE_ISSUER'] = 'foobar'
268+
269+
with app.test_request_context():
270+
access_token = create_access_token('username')
271+
decoded = decode_token(access_token)
272+
assert decoded['iss'] == 'foobar'
273+
274+
275+
def test_mismatch_iss(app, default_access_token):
276+
app.config['JWT_ENCODE_ISSUER'] = 'foobar'
277+
app.config['JWT_DECODE_ISSUER'] = 'baz'
278+
279+
with pytest.raises(InvalidIssuerError):
280+
with app.test_request_context():
281+
invalid_token = create_access_token('username')
282+
decode_token(invalid_token)
283+
284+
285+
def test_valid_decode_iss(app, default_access_token):
266286
app.config['JWT_DECODE_ISSUER'] = 'foobar'
267287

268288
default_access_token['iss'] = 'foobar'
@@ -271,7 +291,9 @@ def test_valid_iss(app, default_access_token):
271291
decoded = decode_token(valid_token)
272292
assert decoded['iss'] == 'foobar'
273293

274-
def test_invalid_iss(app, default_access_token):
294+
295+
def test_invalid_decode_iss(app, default_access_token):
296+
275297
app.config['JWT_DECODE_ISSUER'] = 'baz'
276298

277299
default_access_token['iss'] = 'foobar'

0 commit comments

Comments
 (0)