Skip to content

Commit 7759aa8

Browse files
mizvytmizvyt
andauthored
Add "iat" claim to token (jazzband#192)
Co-authored-by: mizvyt <[email protected]>
1 parent 9b06293 commit 7759aa8

File tree

3 files changed

+41
-5
lines changed

3 files changed

+41
-5
lines changed

rest_framework_simplejwt/serializers.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ def validate(self, attrs):
117117

118118
refresh.set_jti()
119119
refresh.set_exp()
120+
refresh.set_iat()
120121

121122
data['refresh'] = str(refresh)
122123

@@ -133,8 +134,9 @@ def validate(self, attrs):
133134
# passed
134135
token.check_exp(api_settings.SLIDING_TOKEN_REFRESH_EXP_CLAIM)
135136

136-
# Update the "exp" claim
137+
# Update the "exp" and "iat" claims
137138
token.set_exp()
139+
token.set_iat()
138140

139141
return {'token': str(token)}
140142

rest_framework_simplejwt/tokens.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,9 @@ def __init__(self, token=None, verify=True):
5050
# New token. Skip all the verification steps.
5151
self.payload = {api_settings.TOKEN_TYPE_CLAIM: self.token_type}
5252

53-
# Set "exp" claim with default value
53+
# Set "exp" and "iat" claims with default value
5454
self.set_exp(from_time=self.current_time, lifetime=self.lifetime)
55+
self.set_iat(at_time=self.current_time)
5556

5657
# Set "jti" claim
5758
self.set_jti()
@@ -124,6 +125,9 @@ def set_jti(self):
124125
def set_exp(self, claim='exp', from_time=None, lifetime=None):
125126
"""
126127
Updates the expiration time of a token.
128+
129+
See here:
130+
https://tools.ietf.org/html/rfc7519#section-4.1.4
127131
"""
128132
if from_time is None:
129133
from_time = self.current_time
@@ -133,6 +137,18 @@ def set_exp(self, claim='exp', from_time=None, lifetime=None):
133137

134138
self.payload[claim] = datetime_to_epoch(from_time + lifetime)
135139

140+
def set_iat(self, claim='iat', at_time=None):
141+
"""
142+
Updates the time at which the token was issued.
143+
144+
See here:
145+
https://tools.ietf.org/html/rfc7519#section-4.1.6
146+
"""
147+
if at_time is None:
148+
at_time = self.current_time
149+
150+
self.payload[claim] = datetime_to_epoch(at_time)
151+
136152
def check_exp(self, claim='exp', current_time=None):
137153
"""
138154
Checks whether a timestamp value in the given claim has passed (since

tests/test_tokens.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,9 @@ def test_init_no_token_given(self):
6060
self.assertEqual(t.current_time, now)
6161
self.assertIsNone(t.token)
6262

63-
self.assertEqual(len(t.payload), 3)
64-
self.assertEqual(t.payload['exp'], datetime_to_epoch(now + MyToken.lifetime))
63+
self.assertEqual(len(t.payload), 4)
64+
self.assertEqual(t.payload['exp'], datetime_to_epoch(now + MyToken.lifetime))
65+
self.assertEqual(t.payload['iat'], datetime_to_epoch(now))
6566
self.assertIn('jti', t.payload)
6667
self.assertEqual(t.payload[api_settings.TOKEN_TYPE_CLAIM], MyToken.token_type)
6768

@@ -88,9 +89,10 @@ def test_init_token_given(self):
8889
self.assertEqual(t.current_time, now)
8990
self.assertEqual(t.token, encoded_good_token)
9091

91-
self.assertEqual(len(t.payload), 4)
92+
self.assertEqual(len(t.payload), 5)
9293
self.assertEqual(t['some_value'], 'arst')
9394
self.assertEqual(t['exp'], datetime_to_epoch(original_now + MyToken.lifetime))
95+
self.assertEqual(t['iat'], datetime_to_epoch(original_now))
9496
self.assertEqual(t[api_settings.TOKEN_TYPE_CLAIM], MyToken.token_type)
9597
self.assertIn('jti', t.payload)
9698

@@ -169,6 +171,7 @@ def test_str(self):
169171
# content.
170172
del token[api_settings.TOKEN_TYPE_CLAIM]
171173
del token['jti']
174+
del token['iat']
172175

173176
# Should encode the given token
174177
encoded_token = str(token)
@@ -236,6 +239,21 @@ def test_set_exp(self):
236239
self.assertIn('refresh_exp', token)
237240
self.assertEqual(token['refresh_exp'], datetime_to_epoch(now + timedelta(days=1)))
238241

242+
def test_set_iat(self):
243+
now = make_utc(datetime(year=2000, month=1, day=1))
244+
245+
token = MyToken()
246+
token.current_time = now
247+
248+
# By default, should add 'iat' claim to token using `self.current_time`
249+
token.set_iat()
250+
self.assertEqual(token['iat'], datetime_to_epoch(now))
251+
252+
# Should allow overriding of time and claim name
253+
token.set_iat(claim='refresh_iat', at_time=now + timedelta(days=1))
254+
self.assertIn('refresh_iat', token)
255+
self.assertEqual(token['refresh_iat'], datetime_to_epoch(now + timedelta(days=1)))
256+
239257
def test_check_exp(self):
240258
token = MyToken()
241259

0 commit comments

Comments
 (0)