25
25
'' ,
26
26
(r'^auth-token/$' , 'rest_framework_jwt.views.obtain_jwt_token' ),
27
27
(r'^auth-token-refresh/$' , 'rest_framework_jwt.views.refresh_jwt_token' ),
28
+ (r'^auth-token-verify/$' , 'rest_framework_jwt.views.verify_jwt_token' ),
29
+
28
30
)
29
31
30
32
orig_datetime = datetime
@@ -204,20 +206,18 @@ def test_jwt_login_json_bad_creds(self):
204
206
self .assertEqual (response .status_code , 400 )
205
207
206
208
207
- class RefreshJSONWebTokenTests (BaseTestCase ):
208
- urls = 'tests.test_views'
209
-
210
- def setUp (self ):
211
- super (RefreshJSONWebTokenTests , self ).setUp ()
212
- api_settings .JWT_ALLOW_REFRESH = True
209
+ class TokenTestCase (BaseTestCase ):
210
+ """
211
+ Handlers for getting tokens from the API, or creating arbitrary ones.
212
+ """
213
213
214
214
def get_token (self ):
215
215
client = APIClient (enforce_csrf_checks = True )
216
216
response = client .post ('/auth-token/' , self .data , format = 'json' )
217
217
return response .data ['token' ]
218
218
219
219
def create_token (self , user , exp = None , orig_iat = None ):
220
- payload = utils .jwt_payload_handler (self . user )
220
+ payload = utils .jwt_payload_handler (user )
221
221
if exp :
222
222
payload ['exp' ] = exp
223
223
@@ -227,6 +227,84 @@ def create_token(self, user, exp=None, orig_iat=None):
227
227
token = utils .jwt_encode_handler (payload )
228
228
return token
229
229
230
+
231
+ class VerifyJSONWebTokenTests (TokenTestCase ):
232
+
233
+ def test_verify_jwt (self ):
234
+ """
235
+ Test that a valid, non-expired token will return a 200 response
236
+ and itself when passed to the validation endpoint.
237
+ """
238
+ client = APIClient (enforce_csrf_checks = True )
239
+
240
+ orig_token = self .get_token ()
241
+
242
+ # Now try to get a refreshed token
243
+ response = client .post ('/auth-token-verify/' , {'token' : orig_token },
244
+ format = 'json' )
245
+ self .assertEqual (response .status_code , status .HTTP_200_OK )
246
+
247
+ self .assertEqual (response .data ['token' ], orig_token )
248
+
249
+ def test_verify_jwt_fails_with_expired_token (self ):
250
+ """
251
+ Test that an expired token will fail with the correct error.
252
+ """
253
+ client = APIClient (enforce_csrf_checks = True )
254
+
255
+ # Make an expired token..
256
+ token = self .create_token (
257
+ self .user ,
258
+ exp = datetime .utcnow () - timedelta (seconds = 5 ),
259
+ orig_iat = datetime .utcnow () - timedelta (hours = 1 )
260
+ )
261
+
262
+ response = client .post ('/auth-token-verify/' , {'token' : token },
263
+ format = 'json' )
264
+ self .assertEqual (response .status_code , status .HTTP_400_BAD_REQUEST )
265
+ self .assertRegexpMatches (response .data ['non_field_errors' ][0 ],
266
+ 'Signature has expired' )
267
+
268
+ def test_verify_jwt_fails_with_bad_token (self ):
269
+ """
270
+ Test that an invalid token will fail with the correct error.
271
+ """
272
+ client = APIClient (enforce_csrf_checks = True )
273
+
274
+ token = "i am not a correctly formed token"
275
+
276
+ response = client .post ('/auth-token-verify/' , {'token' : token },
277
+ format = 'json' )
278
+ self .assertEqual (response .status_code , status .HTTP_400_BAD_REQUEST )
279
+ self .assertRegexpMatches (response .data ['non_field_errors' ][0 ],
280
+ 'Error decoding signature' )
281
+
282
+ def test_verify_jwt_fails_with_missing_user (self ):
283
+ """
284
+ Test that an invalid token will fail with a user that does not exist.
285
+ """
286
+ client = APIClient (enforce_csrf_checks = True )
287
+
288
+ user = User .objects .create_user (
289
+ email = '[email protected] ' ,
username = 'jsmith' ,
password = 'password' )
290
+
291
+ token = self .create_token (user )
292
+ # Delete the user used to make the token
293
+ user .delete ()
294
+
295
+ response = client .post ('/auth-token-verify/' , {'token' : token },
296
+ format = 'json' )
297
+ self .assertEqual (response .status_code , status .HTTP_400_BAD_REQUEST )
298
+ self .assertRegexpMatches (response .data ['non_field_errors' ][0 ],
299
+ "User doesn't exist" )
300
+
301
+
302
+ class RefreshJSONWebTokenTests (TokenTestCase ):
303
+
304
+ def setUp (self ):
305
+ super (RefreshJSONWebTokenTests , self ).setUp ()
306
+ api_settings .JWT_ALLOW_REFRESH = True
307
+
230
308
def test_refresh_jwt (self ):
231
309
"""
232
310
Test getting a refreshed token from original token works
@@ -257,25 +335,6 @@ def test_refresh_jwt(self):
257
335
self .assertEquals (new_token_decoded ['orig_iat' ], orig_iat )
258
336
self .assertGreater (new_token_decoded ['exp' ], orig_token_decoded ['exp' ])
259
337
260
- def test_refresh_jwt_fails_with_expired_token (self ):
261
- """
262
- Test that using an expired token to refresh won't work
263
- """
264
- client = APIClient (enforce_csrf_checks = True )
265
-
266
- # Make an expired token..
267
- token = self .create_token (
268
- self .user ,
269
- exp = datetime .utcnow () - timedelta (seconds = 5 ),
270
- orig_iat = datetime .utcnow () - timedelta (hours = 1 )
271
- )
272
-
273
- response = client .post ('/auth-token-refresh/' , {'token' : token },
274
- format = 'json' )
275
- self .assertEqual (response .status_code , status .HTTP_400_BAD_REQUEST )
276
- self .assertRegexpMatches (response .data ['non_field_errors' ][0 ],
277
- 'Signature has expired' )
278
-
279
338
def test_refresh_jwt_after_refresh_expiration (self ):
280
339
"""
281
340
Test that token can't be refreshed after token refresh limit
0 commit comments