@@ -68,8 +68,8 @@ describe('verify', function() {
68
68
} ) ;
69
69
70
70
describe ( 'expiration' , function ( ) {
71
- // { foo: 'bar', iat: 1437018582, exp: 1437018583 }
72
- var token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE0MzcwMTg1ODIsImV4cCI6MTQzNzAxODU4M30.NmMv7sXjM1dW0eALNXud8LoXknZ0mH14GtnFclwJv0s ' ;
71
+ // { foo: 'bar', iat: 1437018582, exp: 1437018592 }
72
+ var token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE0MzcwMTg1ODIsImV4cCI6MTQzNzAxODU5Mn0.3aR3vocmgRpG05rsI9MpR6z2T_BGtMQaPq2YR6QaroU ' ;
73
73
var key = 'key' ;
74
74
75
75
var clock ;
@@ -78,22 +78,22 @@ describe('verify', function() {
78
78
} ) ;
79
79
80
80
it ( 'should error on expired token' , function ( done ) {
81
- clock = sinon . useFakeTimers ( 1437018650000 ) ;
81
+ clock = sinon . useFakeTimers ( 1437018650000 ) ; // iat + 58s, exp + 48s
82
82
var options = { algorithms : [ 'HS256' ] } ;
83
83
84
84
jwt . verify ( token , key , options , function ( err , p ) {
85
85
assert . equal ( err . name , 'TokenExpiredError' ) ;
86
86
assert . equal ( err . message , 'jwt expired' ) ;
87
87
assert . equal ( err . expiredAt . constructor . name , 'Date' ) ;
88
- assert . equal ( Number ( err . expiredAt ) , 1437018583000 ) ;
88
+ assert . equal ( Number ( err . expiredAt ) , 1437018592000 ) ;
89
89
assert . isUndefined ( p ) ;
90
90
done ( ) ;
91
91
} ) ;
92
92
} ) ;
93
93
94
94
it ( 'should not error on expired token within clockTolerance interval' , function ( done ) {
95
- clock = sinon . useFakeTimers ( 1437018584000 ) ;
96
- var options = { algorithms : [ 'HS256' ] , clockTolerance : 100 }
95
+ clock = sinon . useFakeTimers ( 1437018594000 ) ; // iat + 12s, exp + 2s
96
+ var options = { algorithms : [ 'HS256' ] , clockTolerance : 5 }
97
97
98
98
jwt . verify ( token , key , options , function ( err , p ) {
99
99
assert . isNull ( err ) ;
@@ -103,8 +103,8 @@ describe('verify', function() {
103
103
} ) ;
104
104
105
105
it ( 'should not error if within maxAge timespan' , function ( done ) {
106
- clock = sinon . useFakeTimers ( 1437018582500 ) ;
107
- var options = { algorithms : [ 'HS256' ] , maxAge : '600ms ' } ;
106
+ clock = sinon . useFakeTimers ( 1437018587500 ) ; // iat + 5.5s, exp - 4.5s
107
+ var options = { algorithms : [ 'HS256' ] , maxAge : '6s ' } ;
108
108
109
109
jwt . verify ( token , key , options , function ( err , p ) {
110
110
assert . isNull ( err ) ;
@@ -114,70 +114,97 @@ describe('verify', function() {
114
114
} ) ;
115
115
116
116
describe ( 'option: maxAge' , function ( ) {
117
- it ( 'should error for claims issued before a certain timespan' , function ( done ) {
118
- clock = sinon . useFakeTimers ( 1437018582500 ) ;
119
- var options = { algorithms : [ 'HS256' ] , maxAge : '321ms' } ;
120
117
121
- jwt . verify ( token , key , options , function ( err , p ) {
122
- assert . equal ( err . name , 'TokenExpiredError' ) ;
123
- assert . equal ( err . message , 'maxAge exceeded' ) ;
124
- assert . equal ( err . expiredAt . constructor . name , 'Date' ) ;
125
- assert . equal ( Number ( err . expiredAt ) , 1437018582321 ) ;
126
- assert . isUndefined ( p ) ;
127
- done ( ) ;
118
+ [ String ( '3s' ) , '3s' , 3 ] . forEach ( function ( maxAge ) {
119
+ it ( `should error for claims issued before a certain timespan (${ typeof maxAge } type)` , function ( done ) {
120
+ clock = sinon . useFakeTimers ( 1437018587000 ) ; // iat + 5s, exp - 5s
121
+ var options = { algorithms : [ 'HS256' ] , maxAge : maxAge } ;
122
+
123
+ jwt . verify ( token , key , options , function ( err , p ) {
124
+ assert . equal ( err . name , 'TokenExpiredError' ) ;
125
+ assert . equal ( err . message , 'maxAge exceeded' ) ;
126
+ assert . equal ( err . expiredAt . constructor . name , 'Date' ) ;
127
+ assert . equal ( Number ( err . expiredAt ) , 1437018585000 ) ;
128
+ assert . isUndefined ( p ) ;
129
+ done ( ) ;
130
+ } ) ;
128
131
} ) ;
129
132
} ) ;
130
133
131
- it ( 'should not error for claims issued before a certain timespan but still inside clockTolerance timespan' , function ( done ) {
132
- clock = sinon . useFakeTimers ( 1437018582500 ) ;
133
- var options = { algorithms : [ 'HS256' ] , maxAge : '321ms' , clockTolerance : 100 } ;
134
+ [ String ( '5s' ) , '5s' , 5 ] . forEach ( function ( maxAge ) {
135
+ it ( `should not error for claims issued before a certain timespan but still inside clockTolerance timespan (${ typeof maxAge } type)` , function ( done ) {
136
+ clock = sinon . useFakeTimers ( 1437018587500 ) ; // iat + 5.5s, exp - 4.5s
137
+ var options = { algorithms : [ 'HS256' ] , maxAge : maxAge , clockTolerance : 1 } ;
134
138
135
- jwt . verify ( token , key , options , function ( err , p ) {
136
- assert . isNull ( err ) ;
137
- assert . equal ( p . foo , 'bar' ) ;
138
- done ( ) ;
139
+ jwt . verify ( token , key , options , function ( err , p ) {
140
+ assert . isNull ( err ) ;
141
+ assert . equal ( p . foo , 'bar' ) ;
142
+ done ( ) ;
143
+ } ) ;
139
144
} ) ;
140
145
} ) ;
141
146
142
- it ( 'should not error if within maxAge timespan' , function ( done ) {
143
- clock = sinon . useFakeTimers ( 1437018582500 ) ;
144
- var options = { algorithms : [ 'HS256' ] , maxAge : '600ms' } ;
147
+ [ String ( '6s' ) , '6s' , 6 ] . forEach ( function ( maxAge ) {
148
+ it ( `should not error if within maxAge timespan (${ typeof maxAge } type)` , function ( done ) {
149
+ clock = sinon . useFakeTimers ( 1437018587500 ) ; // iat + 5.5s, exp - 4.5s
150
+ var options = { algorithms : [ 'HS256' ] , maxAge : maxAge } ;
145
151
146
- jwt . verify ( token , key , options , function ( err , p ) {
147
- assert . isNull ( err ) ;
148
- assert . equal ( p . foo , 'bar' ) ;
149
- done ( ) ;
152
+ jwt . verify ( token , key , options , function ( err , p ) {
153
+ assert . isNull ( err ) ;
154
+ assert . equal ( p . foo , 'bar' ) ;
155
+ done ( ) ;
156
+ } ) ;
150
157
} ) ;
151
158
} ) ;
152
- it ( 'can be more restrictive than expiration' , function ( done ) {
153
- clock = sinon . useFakeTimers ( 1437018582900 ) ;
154
- var options = { algorithms : [ 'HS256' ] , maxAge : '800ms' } ;
155
159
156
- jwt . verify ( token , key , options , function ( err , p ) {
157
- assert . equal ( err . name , 'TokenExpiredError' ) ;
158
- assert . equal ( err . message , 'maxAge exceeded' ) ;
159
- assert . equal ( err . expiredAt . constructor . name , 'Date' ) ;
160
- assert . equal ( Number ( err . expiredAt ) , 1437018582800 ) ;
161
- assert . isUndefined ( p ) ;
162
- done ( ) ;
160
+ [ String ( '8s' ) , '8s' , 8 ] . forEach ( function ( maxAge ) {
161
+ it ( `can be more restrictive than expiration (${ typeof maxAge } type)` , function ( done ) {
162
+ clock = sinon . useFakeTimers ( 1437018591900 ) ; // iat + 9.9s, exp - 0.1s
163
+ var options = { algorithms : [ 'HS256' ] , maxAge : maxAge } ;
164
+
165
+ jwt . verify ( token , key , options , function ( err , p ) {
166
+ assert . equal ( err . name , 'TokenExpiredError' ) ;
167
+ assert . equal ( err . message , 'maxAge exceeded' ) ;
168
+ assert . equal ( err . expiredAt . constructor . name , 'Date' ) ;
169
+ assert . equal ( Number ( err . expiredAt ) , 1437018590000 ) ;
170
+ assert . isUndefined ( p ) ;
171
+ done ( ) ;
172
+ } ) ;
163
173
} ) ;
164
174
} ) ;
165
- it ( 'cannot be more permissive than expiration' , function ( done ) {
166
- clock = sinon . useFakeTimers ( 1437018583100 ) ;
167
- var options = { algorithms : [ 'HS256' ] , maxAge : '1200ms' } ;
168
175
169
- jwt . verify ( token , key , options , function ( err , p ) {
170
- // maxAge not exceded, but still expired
171
- assert . equal ( err . name , 'TokenExpiredError' ) ;
172
- assert . equal ( err . message , 'jwt expired' ) ;
173
- assert . equal ( err . expiredAt . constructor . name , 'Date' ) ;
174
- assert . equal ( Number ( err . expiredAt ) , 1437018583000 ) ;
175
- assert . isUndefined ( p ) ;
176
- done ( ) ;
176
+ [ String ( '12s' ) , '12s' , 12 ] . forEach ( function ( maxAge ) {
177
+ it ( `cannot be more permissive than expiration (${ typeof maxAge } type)` , function ( done ) {
178
+ clock = sinon . useFakeTimers ( 1437018593000 ) ; // iat + 11s, exp + 1s
179
+ var options = { algorithms : [ 'HS256' ] , maxAge : '12s' } ;
180
+
181
+ jwt . verify ( token , key , options , function ( err , p ) {
182
+ // maxAge not exceded, but still expired
183
+ assert . equal ( err . name , 'TokenExpiredError' ) ;
184
+ assert . equal ( err . message , 'jwt expired' ) ;
185
+ assert . equal ( err . expiredAt . constructor . name , 'Date' ) ;
186
+ assert . equal ( Number ( err . expiredAt ) , 1437018592000 ) ;
187
+ assert . isUndefined ( p ) ;
188
+ done ( ) ;
189
+ } ) ;
190
+ } ) ;
191
+ } ) ;
192
+
193
+ [ new String ( '1s' ) , 'no-timespan-string' ] . forEach ( function ( maxAge ) {
194
+ it ( `should error if maxAge is specified with a wrong string format/type (value: ${ maxAge } , type: ${ typeof maxAge } )` , function ( done ) {
195
+ clock = sinon . useFakeTimers ( 1437018587000 ) ; // iat + 5s, exp - 5s
196
+ var options = { algorithms : [ 'HS256' ] , maxAge : maxAge } ;
197
+
198
+ jwt . verify ( token , key , options , function ( err , p ) {
199
+ assert . equal ( err . name , 'JsonWebTokenError' ) ;
200
+ assert . equal ( err . message , '"maxAge" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60' ) ;
201
+ assert . isUndefined ( p ) ;
202
+ done ( ) ;
203
+ } ) ;
177
204
} ) ;
178
205
} ) ;
206
+
179
207
it ( 'should error if maxAge is specified but there is no iat claim' , function ( done ) {
180
- clock = sinon . useFakeTimers ( 1437018582900 ) ;
181
208
var token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmb28iOiJiYXIifQ.0MBPd4Bru9-fK_HY3xmuDAc6N_embknmNuhdb9bKL_U' ;
182
209
var options = { algorithms : [ 'HS256' ] , maxAge : '1s' } ;
183
210
@@ -188,6 +215,7 @@ describe('verify', function() {
188
215
done ( ) ;
189
216
} ) ;
190
217
} ) ;
218
+
191
219
} ) ;
192
220
193
221
describe ( 'option: clockTimestamp' , function ( ) {
@@ -249,7 +277,7 @@ describe('verify', function() {
249
277
} ) ;
250
278
251
279
describe ( 'option: maxAge and clockTimestamp' , function ( ) {
252
- // { foo: 'bar', iat: 1437018582, exp: 1437018800 }
280
+ // { foo: 'bar', iat: 1437018582, exp: 1437018800 } exp = iat + 218s
253
281
var token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE0MzcwMTg1ODIsImV4cCI6MTQzNzAxODgwMH0.AVOsNC7TiT-XVSpCpkwB1240izzCIJ33Lp07gjnXVpA' ;
254
282
it ( 'should error for claims issued before a certain timespan' , function ( done ) {
255
283
var clockTimestamp = 1437018682 ;
@@ -265,12 +293,12 @@ describe('verify', function() {
265
293
} ) ;
266
294
} ) ;
267
295
it ( 'should not error for claims issued before a certain timespan but still inside clockTolerance timespan' , function ( done ) {
268
- var clockTimestamp = 1437018582 ;
296
+ var clockTimestamp = 1437018592 ; // iat + 10s
269
297
var options = {
270
298
algorithms : [ 'HS256' ] ,
271
299
clockTimestamp : clockTimestamp ,
272
- maxAge : '321ms ' ,
273
- clockTolerance : 100
300
+ maxAge : '3s ' ,
301
+ clockTolerance : 10
274
302
} ;
275
303
276
304
jwt . verify ( token , key , options , function ( err , p ) {
@@ -280,8 +308,8 @@ describe('verify', function() {
280
308
} ) ;
281
309
} ) ;
282
310
it ( 'should not error if within maxAge timespan' , function ( done ) {
283
- var clockTimestamp = 1437018582 ;
284
- var options = { algorithms : [ 'HS256' ] , clockTimestamp : clockTimestamp , maxAge : '600ms ' } ;
311
+ var clockTimestamp = 1437018587 ; // iat + 5s
312
+ var options = { algorithms : [ 'HS256' ] , clockTimestamp : clockTimestamp , maxAge : '6s ' } ;
285
313
286
314
jwt . verify ( token , key , options , function ( err , p ) {
287
315
assert . isNull ( err ) ;
@@ -290,7 +318,7 @@ describe('verify', function() {
290
318
} ) ;
291
319
} ) ;
292
320
it ( 'can be more restrictive than expiration' , function ( done ) {
293
- var clockTimestamp = 1437018588 ;
321
+ var clockTimestamp = 1437018588 ; // iat + 6s
294
322
var options = { algorithms : [ 'HS256' ] , clockTimestamp : clockTimestamp , maxAge : '5s' } ;
295
323
296
324
jwt . verify ( token , key , options , function ( err , p ) {
@@ -303,7 +331,7 @@ describe('verify', function() {
303
331
} ) ;
304
332
} ) ;
305
333
it ( 'cannot be more permissive than expiration' , function ( done ) {
306
- var clockTimestamp = 1437018900 ;
334
+ var clockTimestamp = 1437018900 ; // iat + 318s (exp: iat + 218s)
307
335
var options = { algorithms : [ 'HS256' ] , clockTimestamp : clockTimestamp , maxAge : '1000y' } ;
308
336
309
337
jwt . verify ( token , key , options , function ( err , p ) {
0 commit comments