11import pytest
22from flask import Flask , jsonify , json
3- try :
4- from http .cookies import SimpleCookie
5- except ImportError :
6- from Cookie import SimpleCookie
73
84from flask_jwt_extended import (
95 jwt_required , JWTManager , jwt_refresh_token_required , create_access_token ,
106 create_refresh_token , set_access_cookies , set_refresh_cookies ,
117 unset_jwt_cookies
128)
139
14-
1510def _get_cookie_from_response (response , cookie_name ):
1611 cookie_headers = response .headers .getlist ('Set-Cookie' )
1712 for header in cookie_headers :
18- cookie = SimpleCookie ()
19- cookie .load (header )
20- if cookie_name in cookie :
21- return cookie [cookie_name ]
13+ attributes = header .split (';' )
14+ if cookie_name in attributes [0 ]:
15+ cookie = {}
16+ for attr in attributes :
17+ split = attr .split ('=' )
18+ cookie [split [0 ].strip ().lower ()] = split [1 ] if len (split ) > 1 else True
19+ return cookie
2220 return None
2321
24-
2522@pytest .fixture (scope = 'function' )
2623def app ():
2724 app = Flask (__name__ )
@@ -111,7 +108,7 @@ def test_default_access_csrf_protection(app, options):
111108
112109 # Get the jwt cookies and csrf double submit tokens
113110 response = test_client .get (auth_url )
114- csrf_token = _get_cookie_from_response (response , csrf_cookie_name ). value
111+ csrf_token = _get_cookie_from_response (response , csrf_cookie_name )[ csrf_cookie_name ]
115112
116113 # Test you cannot post without the additional csrf protection
117114 response = test_client .post (post_url )
@@ -173,7 +170,7 @@ def test_csrf_with_custom_header_names(app, options):
173170
174171 # Get the jwt cookies and csrf double submit tokens
175172 response = test_client .get (auth_url )
176- csrf_token = _get_cookie_from_response (response , csrf_cookie_name ). value
173+ csrf_token = _get_cookie_from_response (response , csrf_cookie_name )[ csrf_cookie_name ]
177174
178175 # Test that you can post with the csrf double submit value
179176 csrf_headers = {'FOO' : csrf_token }
@@ -194,7 +191,7 @@ def test_custom_csrf_methods(app, options):
194191
195192 # Get the jwt cookies and csrf double submit tokens
196193 response = test_client .get (auth_url )
197- csrf_token = _get_cookie_from_response (response , csrf_cookie_name ). value
194+ csrf_token = _get_cookie_from_response (response , csrf_cookie_name )[ csrf_cookie_name ]
198195
199196 # Insure we can now do posts without csrf
200197 response = test_client .post (post_url )
@@ -240,11 +237,13 @@ def test_default_cookie_options(app):
240237 assert access_cookie is not None
241238 assert access_cookie ['path' ] == '/'
242239 assert access_cookie ['httponly' ] is True
240+ assert 'samesite' not in access_cookie
243241
244242 access_csrf_cookie = _get_cookie_from_response (response , 'csrf_access_token' )
245243 assert access_csrf_cookie is not None
246244 assert access_csrf_cookie ['path' ] == '/'
247- assert access_csrf_cookie ['httponly' ] == ''
245+ assert 'httponly' not in access_csrf_cookie
246+ assert 'samesite' not in access_csrf_cookie
248247
249248 # Test the default refresh cookies
250249 response = test_client .get ('/refresh_token' )
@@ -255,11 +254,13 @@ def test_default_cookie_options(app):
255254 assert refresh_cookie is not None
256255 assert refresh_cookie ['path' ] == '/'
257256 assert refresh_cookie ['httponly' ] is True
257+ assert 'samesite' not in refresh_cookie
258258
259259 refresh_csrf_cookie = _get_cookie_from_response (response , 'csrf_refresh_token' )
260260 assert refresh_csrf_cookie is not None
261261 assert refresh_csrf_cookie ['path' ] == '/'
262- assert refresh_csrf_cookie ['httponly' ] == ''
262+ assert 'httponly' not in refresh_csrf_cookie
263+ assert 'samesite' not in refresh_csrf_cookie
263264
264265
265266def test_custom_cookie_options (app ):
@@ -268,6 +269,7 @@ def test_custom_cookie_options(app):
268269 app .config ['JWT_COOKIE_SECURE' ] = True
269270 app .config ['JWT_COOKIE_DOMAIN' ] = 'test.com'
270271 app .config ['JWT_SESSION_COOKIE' ] = False
272+ app .config ['JWT_COOKIE_SAMESITE' ] = 'Strict'
271273
272274 # Test access cookies with changed options
273275 response = test_client .get ('/access_token' )
@@ -281,13 +283,15 @@ def test_custom_cookie_options(app):
281283 assert access_cookie ['expires' ] != ''
282284 assert access_cookie ['httponly' ] is True
283285 assert access_cookie ['secure' ] is True
286+ assert access_cookie ['samesite' ] == 'Strict'
284287
285288 access_csrf_cookie = _get_cookie_from_response (response , 'csrf_access_token' )
286289 assert access_csrf_cookie is not None
287290 assert access_csrf_cookie ['path' ] == '/'
288291 assert access_csrf_cookie ['secure' ] is True
289292 assert access_csrf_cookie ['domain' ] == 'test.com'
290293 assert access_csrf_cookie ['expires' ] != ''
294+ assert access_csrf_cookie ['samesite' ] == 'Strict'
291295
292296 # Test refresh cookies with changed options
293297 response = test_client .get ('/refresh_token' )
@@ -301,13 +305,15 @@ def test_custom_cookie_options(app):
301305 assert refresh_cookie ['httponly' ] is True
302306 assert refresh_cookie ['secure' ] is True
303307 assert refresh_cookie ['expires' ] != ''
308+ assert refresh_cookie ['samesite' ] == 'Strict'
304309
305310 refresh_csrf_cookie = _get_cookie_from_response (response , 'csrf_refresh_token' )
306311 assert refresh_csrf_cookie is not None
307312 assert refresh_csrf_cookie ['path' ] == '/'
308313 assert refresh_csrf_cookie ['secure' ] is True
309314 assert refresh_csrf_cookie ['domain' ] == 'test.com'
310315 assert refresh_csrf_cookie ['expires' ] != ''
316+ assert refresh_csrf_cookie ['samesite' ] == 'Strict'
311317
312318
313319def test_custom_cookie_names_and_paths (app ):
0 commit comments