Skip to content

Commit e4ea82f

Browse files
committed
Helper function to logout when using cookies to store jwt
1 parent 37d2eff commit e4ea82f

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

flask_jwt_extended/utils.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,3 +378,24 @@ def set_refresh_cookies(response, encoded_refresh_token):
378378
secure=get_cookie_secure(),
379379
httponly=False,
380380
path='/')
381+
382+
383+
def unset_jwt_cookies(response):
384+
"""
385+
Takes a flask response object, and configures it to unset (delete) the JWT
386+
cookies. Basically, this is a logout helper method if using cookies to store
387+
the JWT
388+
"""
389+
response.set_cookie(get_refresh_cookie_name(),
390+
value='',
391+
expires=0,
392+
secure=get_cookie_secure(),
393+
httponly=True,
394+
path=get_refresh_cookie_path())
395+
response.set_cookie(get_access_cookie_name(),
396+
value='',
397+
expires=0,
398+
secure=get_cookie_secure(),
399+
httponly=True,
400+
path=get_access_cookie_path())
401+
return response

tests/test_protected_endpoints.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import jwt
88

99
from flask_jwt_extended.utils import _encode_access_token, get_jwt_claims, \
10-
get_jwt_identity, set_refresh_cookies, set_access_cookies
10+
get_jwt_identity, set_refresh_cookies, set_access_cookies, unset_jwt_cookies
1111
from flask_jwt_extended import JWTManager, create_refresh_token, \
1212
jwt_refresh_token_required, create_access_token, fresh_jwt_required, \
1313
jwt_required
@@ -344,6 +344,12 @@ def login():
344344
set_refresh_cookies(resp, refresh_token)
345345
return resp, 200
346346

347+
@self.app.route('/auth/logout', methods=['POST'])
348+
def logout():
349+
resp = jsonify({'logout': True})
350+
unset_jwt_cookies(resp)
351+
return resp, 200
352+
347353
@self.app.route('/auth/refresh', methods=['POST'])
348354
@jwt_refresh_token_required
349355
def refresh():
@@ -443,6 +449,13 @@ def test_headers(self):
443449
self.assertIn('x_csrf_refresh_token', refresh_csrf)
444450
self.assertIn('Path=/', refresh_csrf)
445451

452+
# Try logout headers
453+
resp = self.client.post('/auth/logout')
454+
refresh_cookie = resp.headers[1][1]
455+
access_cookie = resp.headers[2][1]
456+
self.assertIn('Expires=Thu, 01-Jan-1970', refresh_cookie)
457+
self.assertIn('Expires=Thu, 01-Jan-1970', access_cookie)
458+
446459
def test_endpoints_with_cookies(self):
447460
self.app.config['JWT_COOKIE_CSRF_PROTECT'] = False
448461

0 commit comments

Comments
 (0)