55 ExpiredSignatureError , InvalidTokenError , InvalidAudienceError ,
66 InvalidIssuerError , DecodeError
77)
8+
89try :
910 from flask import _app_ctx_stack as ctx_stack
1011except ImportError : # pragma: no cover
2223 default_unauthorized_callback , default_needs_fresh_token_callback ,
2324 default_revoked_token_callback , default_user_loader_error_callback ,
2425 default_claims_verification_callback , default_verify_claims_failed_callback ,
25- default_decode_key_callback , default_encode_key_callback
26- )
26+ default_decode_key_callback , default_encode_key_callback ,
27+ default_jwt_headers_callback )
2728from flask_jwt_extended .tokens import (
2829 encode_refresh_token , encode_access_token
2930)
@@ -64,6 +65,7 @@ def __init__(self, app=None):
6465 self ._verify_claims_failed_callback = default_verify_claims_failed_callback
6566 self ._decode_key_callback = default_decode_key_callback
6667 self ._encode_key_callback = default_encode_key_callback
68+ self ._jwt_additional_header_callback = default_jwt_headers_callback
6769
6870 # Register this extension with the flask app now (if it is provided)
6971 if app is not None :
@@ -454,13 +456,33 @@ def encode_key_loader(self, callback):
454456 self ._encode_key_callback = callback
455457 return callback
456458
457- def _create_refresh_token (self , identity , expires_delta = None , user_claims = None ):
459+ def additional_headers_loader (self , callback ):
460+ """
461+ This decorator sets the callback function for adding custom headers to an
462+ access token when :func:`~flask_jwt_extended.create_access_token` is
463+ called. By default, two headers will be added the type of the token, which is JWT,
464+ and the signing algorithm being used, such as HMAC SHA256 or RSA.
465+
466+ *HINT*: The callback function must be a function that takes **no** argument,
467+ which is the object passed into
468+ :func:`~flask_jwt_extended.create_access_token`, and returns the custom
469+ claims you want included in the access tokens. This returned claims
470+ must be *JSON serializable*.
471+ """
472+ self ._jwt_additional_header_callback = callback
473+ return callback
474+
475+ def _create_refresh_token (self , identity , expires_delta = None , user_claims = None ,
476+ headers = None ):
458477 if expires_delta is None :
459478 expires_delta = config .refresh_expires
460479
461480 if user_claims is None and config .user_claims_in_refresh_token :
462481 user_claims = self ._user_claims_callback (identity )
463482
483+ if headers is None :
484+ headers = self ._jwt_additional_header_callback (identity )
485+
464486 refresh_token = encode_refresh_token (
465487 identity = self ._user_identity_callback (identity ),
466488 secret = self ._encode_key_callback (identity ),
@@ -470,17 +492,22 @@ def _create_refresh_token(self, identity, expires_delta=None, user_claims=None):
470492 csrf = config .csrf_protect ,
471493 identity_claim_key = config .identity_claim_key ,
472494 user_claims_key = config .user_claims_key ,
473- json_encoder = config .json_encoder
495+ json_encoder = config .json_encoder ,
496+ headers = headers
474497 )
475498 return refresh_token
476499
477- def _create_access_token (self , identity , fresh = False , expires_delta = None , user_claims = None ):
500+ def _create_access_token (self , identity , fresh = False , expires_delta = None ,
501+ user_claims = None , headers = None ):
478502 if expires_delta is None :
479503 expires_delta = config .access_expires
480504
481505 if user_claims is None :
482506 user_claims = self ._user_claims_callback (identity )
483507
508+ if headers is None :
509+ headers = self ._jwt_additional_header_callback (identity )
510+
484511 access_token = encode_access_token (
485512 identity = self ._user_identity_callback (identity ),
486513 secret = self ._encode_key_callback (identity ),
@@ -491,6 +518,7 @@ def _create_access_token(self, identity, fresh=False, expires_delta=None, user_c
491518 csrf = config .csrf_protect ,
492519 identity_claim_key = config .identity_claim_key ,
493520 user_claims_key = config .user_claims_key ,
494- json_encoder = config .json_encoder
521+ json_encoder = config .json_encoder ,
522+ headers = headers
495523 )
496524 return access_token
0 commit comments