11from functools import wraps
22
33from flask import request
4- from werkzeug .security import safe_str_cmp
54try :
65 from flask import _app_ctx_stack as ctx_stack
76except ImportError : # pragma: no cover
1312 FreshTokenRequired , CSRFError , UserLoadError , RevokedTokenError ,
1413 UserClaimsVerificationError
1514)
16- from flask_jwt_extended .tokens import decode_jwt
1715from flask_jwt_extended .utils import (
18- has_user_loader , user_loader , token_in_blacklist ,
16+ has_user_loader , user_loader , token_in_blacklist , decode_token ,
1917 has_token_in_blacklist_callback , verify_token_claims
2018)
2119
@@ -34,9 +32,9 @@ def jwt_required(fn):
3432 def wrapper (* args , ** kwargs ):
3533 jwt_data = _decode_jwt_from_request (request_type = 'access' )
3634 ctx_stack .top .jwt = jwt_data
37- if not verify_token_claims (jwt_data [config .user_claims ]):
35+ if not verify_token_claims (jwt_data [config .user_claims_key ]):
3836 raise UserClaimsVerificationError ('User claims verification failed' )
39- _load_user (jwt_data [config .identity_claim ])
37+ _load_user (jwt_data [config .identity_claim_key ])
4038 return fn (* args , ** kwargs )
4139 return wrapper
4240
@@ -60,9 +58,9 @@ def wrapper(*args, **kwargs):
6058 try :
6159 jwt_data = _decode_jwt_from_request (request_type = 'access' )
6260 ctx_stack .top .jwt = jwt_data
63- if not verify_token_claims (jwt_data [config .user_claims ]):
61+ if not verify_token_claims (jwt_data [config .user_claims_key ]):
6462 raise UserClaimsVerificationError ('User claims verification failed' )
65- _load_user (jwt_data [config .identity_claim ])
63+ _load_user (jwt_data [config .identity_claim_key ])
6664 except (NoAuthorizationError , InvalidHeaderError ):
6765 pass
6866 return fn (* args , ** kwargs )
@@ -85,9 +83,9 @@ def wrapper(*args, **kwargs):
8583 ctx_stack .top .jwt = jwt_data
8684 if not jwt_data ['fresh' ]:
8785 raise FreshTokenRequired ('Fresh token required' )
88- if not verify_token_claims (jwt_data [config .user_claims ]):
86+ if not verify_token_claims (jwt_data [config .user_claims_key ]):
8987 raise UserClaimsVerificationError ('User claims verification failed' )
90- _load_user (jwt_data [config .identity_claim ])
88+ _load_user (jwt_data [config .identity_claim_key ])
9189 return fn (* args , ** kwargs )
9290 return wrapper
9391
@@ -103,7 +101,7 @@ def jwt_refresh_token_required(fn):
103101 def wrapper (* args , ** kwargs ):
104102 jwt_data = _decode_jwt_from_request (request_type = 'refresh' )
105103 ctx_stack .top .jwt = jwt_data
106- _load_user (jwt_data [config .identity_claim ])
104+ _load_user (jwt_data [config .identity_claim_key ])
107105 return fn (* args , ** kwargs )
108106 return wrapper
109107
@@ -148,20 +146,14 @@ def _decode_jwt_from_headers():
148146 if len (parts ) != 1 :
149147 msg = "Bad {} header. Expected value '<JWT>'" .format (header_name )
150148 raise InvalidHeaderError (msg )
151- token = parts [0 ]
149+ encoded_token = parts [0 ]
152150 else :
153151 if parts [0 ] != header_type or len (parts ) != 2 :
154152 msg = "Bad {} header. Expected value '{} <JWT>'" .format (header_name , header_type )
155153 raise InvalidHeaderError (msg )
156- token = parts [1 ]
154+ encoded_token = parts [1 ]
157155
158- return decode_jwt (
159- encoded_token = token ,
160- secret = config .decode_key ,
161- algorithm = config .algorithm ,
162- csrf = False ,
163- identity_claim = config .identity_claim
164- )
156+ return decode_token (encoded_token )
165157
166158
167159def _decode_jwt_from_cookies (request_type ):
@@ -172,29 +164,18 @@ def _decode_jwt_from_cookies(request_type):
172164 cookie_key = config .refresh_cookie_name
173165 csrf_header_key = config .refresh_csrf_header_name
174166
167+ if config .csrf_protect and request .method in config .csrf_request_methods :
168+ csrf_value = request .headers .get (csrf_header_key , None )
169+ if not csrf_value :
170+ raise CSRFError ("Missing CSRF token in headers" )
171+ else :
172+ csrf_value = None
173+
175174 encoded_token = request .cookies .get (cookie_key )
176175 if not encoded_token :
177176 raise NoAuthorizationError ('Missing cookie "{}"' .format (cookie_key ))
178177
179- decoded_token = decode_jwt (
180- encoded_token = encoded_token ,
181- secret = config .decode_key ,
182- algorithm = config .algorithm ,
183- csrf = config .csrf_protect ,
184- identity_claim = config .identity_claim
185- )
186-
187- # Verify csrf double submit tokens match if required
188- if config .csrf_protect and request .method in config .csrf_request_methods :
189- csrf_token_in_token = decoded_token ['csrf' ]
190- csrf_token_in_header = request .headers .get (csrf_header_key , None )
191-
192- if not csrf_token_in_header :
193- raise CSRFError ("Missing CSRF token in headers" )
194- if not safe_str_cmp (csrf_token_in_header , csrf_token_in_token ):
195- raise CSRFError ("CSRF double submit tokens do not match" )
196-
197- return decoded_token
178+ return decode_token (encoded_token , csrf_value = csrf_value )
198179
199180
200181def _decode_jwt_from_request (request_type ):
0 commit comments