You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					133 lines
				
				4.7 KiB
			
		
		
			
		
	
	
					133 lines
				
				4.7 KiB
			| 
											3 years ago
										 | var jwt = require('../index'); | ||
|  | var jws = require('jws'); | ||
|  | var fs = require('fs'); | ||
|  | var path = require('path'); | ||
|  | var sinon = require('sinon'); | ||
|  | 
 | ||
|  | var assert = require('chai').assert; | ||
|  | 
 | ||
|  | describe('verify', function() { | ||
|  |   var pub = fs.readFileSync(path.join(__dirname, 'pub.pem')); | ||
|  |   var priv = fs.readFileSync(path.join(__dirname, 'priv.pem')); | ||
|  | 
 | ||
|  |   it('should first assume JSON claim set', function (done) { | ||
|  |     var header = { alg: 'RS256' }; | ||
|  |     var payload = { iat: Math.floor(Date.now() / 1000 ) }; | ||
|  | 
 | ||
|  |     var signed = jws.sign({ | ||
|  |         header: header, | ||
|  |         payload: payload, | ||
|  |         secret: priv, | ||
|  |         encoding: 'utf8' | ||
|  |     }); | ||
|  | 
 | ||
|  |     jwt.verify(signed, pub, {typ: 'JWT'}, function(err, p) { | ||
|  |         assert.isNull(err); | ||
|  |         assert.deepEqual(p, payload); | ||
|  |         done(); | ||
|  |     }); | ||
|  |   }); | ||
|  | 
 | ||
|  |   describe('expiration', function () { | ||
|  |     // { foo: 'bar', iat: 1437018582, exp: 1437018583 }
 | ||
|  |     var token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE0MzcwMTg1ODIsImV4cCI6MTQzNzAxODU4M30.NmMv7sXjM1dW0eALNXud8LoXknZ0mH14GtnFclwJv0s'; | ||
|  |     var key = 'key'; | ||
|  |        | ||
|  |     var clock; | ||
|  |     afterEach(function () { | ||
|  |       try { clock.restore(); } catch (e) {} | ||
|  |     }); | ||
|  | 
 | ||
|  |     it('should error on expired token', function (done) { | ||
|  |       clock = sinon.useFakeTimers(1437018650000); | ||
|  |       var options = {algorithms: ['HS256']}; | ||
|  | 
 | ||
|  |       jwt.verify(token, key, options, function (err, p) { | ||
|  |         assert.equal(err.name, 'TokenExpiredError'); | ||
|  |         assert.equal(err.message, 'jwt expired'); | ||
|  |         assert.equal(err.expiredAt.constructor.name, 'Date'); | ||
|  |         assert.equal(Number(err.expiredAt), 1437018583000); | ||
|  |         assert.isUndefined(p); | ||
|  |         done(); | ||
|  |       }); | ||
|  |     }); | ||
|  | 
 | ||
|  |     it('should not error on unexpired token', function (done) { | ||
|  |       clock = sinon.useFakeTimers(1437018582000); | ||
|  |       var options = {algorithms: ['HS256']} | ||
|  | 
 | ||
|  |       jwt.verify(token, key, options, function (err, p) { | ||
|  |         assert.isNull(err); | ||
|  |         assert.equal(p.foo, 'bar'); | ||
|  |         done(); | ||
|  |       }); | ||
|  |     }); | ||
|  | 
 | ||
|  |     describe('option: maxAge', function () { | ||
|  |       it('should error for claims issued before a certain timespan', function (done) { | ||
|  |         clock = sinon.useFakeTimers(1437018582500); | ||
|  |         var options = {algorithms: ['HS256'], maxAge: '321ms'}; | ||
|  | 
 | ||
|  |         jwt.verify(token, key, options, function (err, p) { | ||
|  |           assert.equal(err.name, 'TokenExpiredError'); | ||
|  |           assert.equal(err.message, 'maxAge exceeded'); | ||
|  |           assert.equal(err.expiredAt.constructor.name, 'Date'); | ||
|  |           assert.equal(Number(err.expiredAt), 1437018582321); | ||
|  |           assert.isUndefined(p); | ||
|  |           done(); | ||
|  |         }); | ||
|  |       }); | ||
|  |       it('should not error if within maxAge timespan', function (done) { | ||
|  |         clock = sinon.useFakeTimers(1437018582500); | ||
|  |         var options = {algorithms: ['HS256'], maxAge: '600ms'}; | ||
|  |          | ||
|  |         jwt.verify(token, key, options, function (err, p) { | ||
|  |           assert.isNull(err); | ||
|  |           assert.equal(p.foo, 'bar'); | ||
|  |           done(); | ||
|  |         }); | ||
|  |       }); | ||
|  |       it('can be more restrictive than expiration', function (done) { | ||
|  |         clock = sinon.useFakeTimers(1437018582900); | ||
|  |         var options = {algorithms: ['HS256'], maxAge: '800ms'}; | ||
|  |          | ||
|  |         jwt.verify(token, key, options, function (err, p) { | ||
|  |           assert.equal(err.name, 'TokenExpiredError'); | ||
|  |           assert.equal(err.message, 'maxAge exceeded'); | ||
|  |           assert.equal(err.expiredAt.constructor.name, 'Date'); | ||
|  |           assert.equal(Number(err.expiredAt), 1437018582800); | ||
|  |           assert.isUndefined(p); | ||
|  |           done(); | ||
|  |         }); | ||
|  |       }); | ||
|  |       it('cannot be more permissive than expiration', function (done) { | ||
|  |         clock = sinon.useFakeTimers(1437018583100); | ||
|  |         var options = {algorithms: ['HS256'], maxAge: '1200ms'}; | ||
|  |          | ||
|  |         jwt.verify(token, key, options, function (err, p) { | ||
|  |           // maxAge not exceded, but still expired
 | ||
|  |           assert.equal(err.name, 'TokenExpiredError'); | ||
|  |           assert.equal(err.message, 'jwt expired'); | ||
|  |           assert.equal(err.expiredAt.constructor.name, 'Date'); | ||
|  |           assert.equal(Number(err.expiredAt), 1437018583000); | ||
|  |           assert.isUndefined(p); | ||
|  |           done(); | ||
|  |         }); | ||
|  |       }); | ||
|  |       it('should error if maxAge is specified but there is no iat claim', function (done) { | ||
|  |         clock = sinon.useFakeTimers(1437018582900); | ||
|  |         var token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmb28iOiJiYXIifQ.0MBPd4Bru9-fK_HY3xmuDAc6N_embknmNuhdb9bKL_U'; | ||
|  |         var options = {algorithms: ['HS256'], maxAge: '1s'}; | ||
|  |          | ||
|  |         jwt.verify(token, key, options, function (err, p) { | ||
|  |           assert.equal(err.name, 'JsonWebTokenError'); | ||
|  |           assert.equal(err.message, 'iat required when maxAge is specified'); | ||
|  |           assert.isUndefined(p); | ||
|  |           done(); | ||
|  |         }); | ||
|  |       }); | ||
|  |     }); | ||
|  |   }); | ||
|  | 
 | ||
|  | }); |