Skip to content

Commit 7b8619e

Browse files
authored
Merge pull request #51 from faisalabujabal/master
Getting Token From Encoded Token
2 parents 8b18943 + d2d91b4 commit 7b8619e

File tree

3 files changed

+49
-8
lines changed

3 files changed

+49
-8
lines changed

flask_jwt_extended/blacklist.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from flask_jwt_extended.config import config
77
from flask_jwt_extended.exceptions import RevokedTokenError
8+
from flask_jwt_extended.utils import get_jti
89

910
# TODO make simplekv an optional dependency if blacklist is disabled
1011

@@ -80,13 +81,24 @@ def unrevoke_token(jti):
8081
"""
8182
Revoke a token
8283
83-
:param jti: The jti of the token to revoke
84+
:param jti: The jti of the token to unrevoke
8485
"""
8586
_update_token(jti, revoked=False)
8687

8788

8889
@_verify_blacklist_enabled
89-
def get_stored_token(jti):
90+
def get_stored_token(jti=None, encoded_token=None):
91+
"""
92+
Get the stored token for the passed in jti or encoded_token
93+
94+
:param jti: The jti of the token
95+
:param encoded_token: The encoded JWT string
96+
:return: Python dictionary with the token information
97+
"""
98+
if jti is None and encoded_token is not None:
99+
jti = get_jti(encoded_token)
100+
elif jti is None and encoded_token is None:
101+
raise ValueError('Either jti or encoded_token is required')
90102
return _get_token_from_store(jti)
91103

92104

flask_jwt_extended/utils.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,16 @@ def get_jwt_claims():
3232
return get_raw_jwt().get('user_claims', {})
3333

3434

35+
def get_jti(encoded_token):
36+
"""
37+
Returns the JTI given the JWT encoded token
38+
39+
:param encoded_token: The encoded JWT string
40+
:return: The JTI of the token
41+
"""
42+
return decode_jwt(encoded_token, config.secret_key, config.algorithm, config.csrf_protect).get('jti')
43+
44+
3545
def _get_jwt_manager():
3646
try:
3747
return current_app.jwt_manager

tests/test_blacklist.py

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,15 @@ def login():
3636
}
3737
return jsonify(ret), 200
3838

39-
@self.app.route('/auth/token/<identity>', methods=['GET'])
40-
def get_single_token(identity):
39+
@self.app.route('/auth/token/jti/<jti>', methods=['GET'])
40+
@self.app.route('/auth/token/encoded_token/<encoded_token>', methods=['GET'])
41+
@self.app.route('/auth/token/encoded_token/', methods=['GET'])
42+
def get_single_token(jti=None, encoded_token=None):
4143
try:
42-
return jsonify(get_stored_token(identity)), 200
44+
if jti is not None:
45+
return jsonify(get_stored_token(jti=jti)), 200
46+
else:
47+
return jsonify(get_stored_token(encoded_token=encoded_token)), 200
4348
except KeyError:
4449
return jsonify({"msg": "token not found"}), 404
4550

@@ -399,20 +404,34 @@ def test_get_specific_identity(self):
399404
self.assertEqual(len(data), 0)
400405

401406
def test_get_stored_token(self):
402-
self._login('test1')
407+
access_token, refresh_token = self._login('test1')
403408
response = self.client.get('/auth/tokens')
404409
data = json.loads(response.get_data(as_text=True))
405410
refresh_jti = data[0]['token']['jti']
406411

407-
response = self.client.get('/auth/token/{}'.format(refresh_jti))
412+
# Test getting the token by passing in JTI
413+
response = self.client.get('/auth/token/jti/{}'.format(refresh_jti))
414+
status_code = response.status_code
415+
data = json.loads(response.get_data(as_text=True))
416+
self.assertEqual(status_code, 200)
417+
self.assertIn('token', data)
418+
self.assertIn('revoked', data)
419+
self.assertEqual(len(data), 2)
420+
421+
# Test getting the token by passing in the encoded token
422+
response = self.client.get('/auth/token/encoded_token/{}'.format(refresh_token))
408423
status_code = response.status_code
409424
data = json.loads(response.get_data(as_text=True))
410425
self.assertEqual(status_code, 200)
411426
self.assertIn('token', data)
412427
self.assertIn('revoked', data)
413428
self.assertEqual(len(data), 2)
414429

415-
response = self.client.get('/auth/token/404notokenfound')
430+
# Test passing neither throws an exception
431+
with self.assertRaises(ValueError):
432+
self.client.get('/auth/token/encoded_token/')
433+
434+
response = self.client.get('/auth/token/jti/404notokenfound')
416435
status_code = response.status_code
417436
data = json.loads(response.get_data(as_text=True))
418437
self.assertEqual(status_code, 404)

0 commit comments

Comments
 (0)