@@ -2,14 +2,15 @@ var jwt = require('../index');
2
2
var jws = require ( 'jws' ) ;
3
3
var fs = require ( 'fs' ) ;
4
4
var path = require ( 'path' ) ;
5
+ var sinon = require ( 'sinon' ) ;
5
6
6
7
var assert = require ( 'chai' ) . assert ;
7
8
8
9
describe ( 'verify' , function ( ) {
9
10
var pub = fs . readFileSync ( path . join ( __dirname , 'pub.pem' ) ) ;
10
11
var priv = fs . readFileSync ( path . join ( __dirname , 'priv.pem' ) ) ;
11
12
12
- it ( 'should first assume JSON claim set' , function ( ) {
13
+ it ( 'should first assume JSON claim set' , function ( done ) {
13
14
var header = { alg : 'RS256' } ;
14
15
var payload = { iat : Math . floor ( Date . now ( ) / 1000 ) } ;
15
16
@@ -23,6 +24,109 @@ describe('verify', function() {
23
24
jwt . verify ( signed , pub , { typ : 'JWT' } , function ( err , p ) {
24
25
assert . isNull ( err ) ;
25
26
assert . deepEqual ( p , payload ) ;
27
+ done ( ) ;
26
28
} ) ;
27
29
} ) ;
30
+
31
+ describe ( 'expiration' , function ( ) {
32
+ // { foo: 'bar', iat: 1437018582, exp: 1437018583 }
33
+ var token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE0MzcwMTg1ODIsImV4cCI6MTQzNzAxODU4M30.NmMv7sXjM1dW0eALNXud8LoXknZ0mH14GtnFclwJv0s' ;
34
+ var key = 'key' ;
35
+
36
+ var clock ;
37
+ afterEach ( function ( ) {
38
+ try { clock . restore ( ) ; } catch ( e ) { }
39
+ } ) ;
40
+
41
+ it ( 'should error on expired token' , function ( done ) {
42
+ clock = sinon . useFakeTimers ( 1437018650000 ) ;
43
+ var options = { algorithms : [ 'HS256' ] } ;
44
+
45
+ jwt . verify ( token , key , options , function ( err , p ) {
46
+ assert . equal ( err . name , 'TokenExpiredError' ) ;
47
+ assert . equal ( err . message , 'jwt expired' ) ;
48
+ assert . equal ( err . expiredAt . constructor . name , 'Date' ) ;
49
+ assert . equal ( Number ( err . expiredAt ) , 1437018583000 ) ;
50
+ assert . isUndefined ( p ) ;
51
+ done ( ) ;
52
+ } ) ;
53
+ } ) ;
54
+
55
+ it ( 'should not error on unexpired token' , function ( done ) {
56
+ clock = sinon . useFakeTimers ( 1437018582000 ) ;
57
+ var options = { algorithms : [ 'HS256' ] }
58
+
59
+ jwt . verify ( token , key , options , function ( err , p ) {
60
+ assert . isNull ( err ) ;
61
+ assert . equal ( p . foo , 'bar' ) ;
62
+ done ( ) ;
63
+ } ) ;
64
+ } ) ;
65
+
66
+ describe ( 'option: maxAge' , function ( ) {
67
+ it ( 'should error for claims issued before a certain timespan' , function ( done ) {
68
+ clock = sinon . useFakeTimers ( 1437018582500 ) ;
69
+ var options = { algorithms : [ 'HS256' ] , maxAge : '321ms' } ;
70
+
71
+ jwt . verify ( token , key , options , function ( err , p ) {
72
+ assert . equal ( err . name , 'TokenExpiredError' ) ;
73
+ assert . equal ( err . message , 'maxAge exceeded' ) ;
74
+ assert . equal ( err . expiredAt . constructor . name , 'Date' ) ;
75
+ assert . equal ( Number ( err . expiredAt ) , 1437018582321 ) ;
76
+ assert . isUndefined ( p ) ;
77
+ done ( ) ;
78
+ } ) ;
79
+ } ) ;
80
+ it ( 'should not error if within maxAge timespan' , function ( done ) {
81
+ clock = sinon . useFakeTimers ( 1437018582500 ) ;
82
+ var options = { algorithms : [ 'HS256' ] , maxAge : '600ms' } ;
83
+
84
+ jwt . verify ( token , key , options , function ( err , p ) {
85
+ assert . isNull ( err ) ;
86
+ assert . equal ( p . foo , 'bar' ) ;
87
+ done ( ) ;
88
+ } ) ;
89
+ } ) ;
90
+ it ( 'can be more restrictive than expiration' , function ( done ) {
91
+ clock = sinon . useFakeTimers ( 1437018582900 ) ;
92
+ var options = { algorithms : [ 'HS256' ] , maxAge : '800ms' } ;
93
+
94
+ jwt . verify ( token , key , options , function ( err , p ) {
95
+ assert . equal ( err . name , 'TokenExpiredError' ) ;
96
+ assert . equal ( err . message , 'maxAge exceeded' ) ;
97
+ assert . equal ( err . expiredAt . constructor . name , 'Date' ) ;
98
+ assert . equal ( Number ( err . expiredAt ) , 1437018582800 ) ;
99
+ assert . isUndefined ( p ) ;
100
+ done ( ) ;
101
+ } ) ;
102
+ } ) ;
103
+ it ( 'cannot be more permissive than expiration' , function ( done ) {
104
+ clock = sinon . useFakeTimers ( 1437018583100 ) ;
105
+ var options = { algorithms : [ 'HS256' ] , maxAge : '1200ms' } ;
106
+
107
+ jwt . verify ( token , key , options , function ( err , p ) {
108
+ // maxAge not exceded, but still expired
109
+ assert . equal ( err . name , 'TokenExpiredError' ) ;
110
+ assert . equal ( err . message , 'jwt expired' ) ;
111
+ assert . equal ( err . expiredAt . constructor . name , 'Date' ) ;
112
+ assert . equal ( Number ( err . expiredAt ) , 1437018583000 ) ;
113
+ assert . isUndefined ( p ) ;
114
+ done ( ) ;
115
+ } ) ;
116
+ } ) ;
117
+ it ( 'should error if maxAge is specified but there is no iat claim' , function ( done ) {
118
+ clock = sinon . useFakeTimers ( 1437018582900 ) ;
119
+ var token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmb28iOiJiYXIifQ.0MBPd4Bru9-fK_HY3xmuDAc6N_embknmNuhdb9bKL_U' ;
120
+ var options = { algorithms : [ 'HS256' ] , maxAge : '1s' } ;
121
+
122
+ jwt . verify ( token , key , options , function ( err , p ) {
123
+ assert . equal ( err . name , 'JsonWebTokenError' ) ;
124
+ assert . equal ( err . message , 'iat required when maxAge is specified' ) ;
125
+ assert . isUndefined ( p ) ;
126
+ done ( ) ;
127
+ } ) ;
128
+ } ) ;
129
+ } ) ;
130
+ } ) ;
131
+
28
132
} ) ;
0 commit comments