UNPKG

jsonwebtoken-redis

Version:
136 lines (103 loc) 4.83 kB
# jsonwebtoken-redis This library completely repeats the entire functionality of the library [jsonwebtoken](https://www.npmjs.com/package/jsonwebtoken), with four important additions: 1. The token expiration time can be completely managed by Redis. 2. You can invalidate the token by removing it from Redis. 3. You can postpone the expiration a token. 4. There's no callback. All functions returns Promises. # Installation ```javascript npm install jsonwebtoken-redis ``` # Quick start ```javascript const Redis = require('redis'); const redis = new Redis(); const JwtRedis = require('jsonwebtoken-redis'); const jwtRedis = new JwtRedis(redis, { prefix: 'session:' // The prefix used in Redis keys (optional). Defaults to "session:". expiresKeyIn: '24 hours' // The default Redis expiration time (optional) promiseImpl: Promise // Custom promise library (optional). Defaults to native Promise. }); const secret = 'shhhhhh'; const payload = { scope: 'user', user: '1', }; // Sign function call overriding the default Redis expiration time provided above jwtRedis.sign(payload, secret, {expiresKeyIn: '48 hours'}).bind({}).then((token) => { this.token = token; // Returns the decoded payload without verifying if the signature is valid return jwtRedis.decode(token, secret, {complete: true}); }).then((decoded) => { // Returns the decoded payload verifying if the signature is valid return jwtRedis.verify(this.token, secret); }).then((decoded) => { // Increases the expiration time by 48 hours return jwtRedis.touch(this.token); }).then(() => { // Removes the token from Redis, invalidating it in the next "verify" function calls. return jwtRedis.destroy(this.token); }); ``` # Expiration time managed by Redis There's a new option ````expiresKeyIn```` when you call [sign](https://www.npmjs.com/package/jsonwebtoken#jwtsignpayload-secretorprivatekey-options-callback). This option is used to set the expiration time of the key/value created in Redis. Using this option the expiration time is completely managed by Redis, in other words, the key/value is created in Redis through the command ````expire````. The token it self doesn't contain any expiration data. ```javascript jwtRedis.sign(payload, secret, {expiresKeyIn: '48 hours'}).then((token) => { }); ``` You can continue to use the option ````expiresIn```` or the payload attribute ````exp````, but the option ````expiresKeyIn```` will be completely ignore. The key/value will be created in Redis with the expiration based on jwt option or payload attriute mentioned previously. Attention: Implementing this way, you can't postpone the expiration in Redis because the token it self will expire. # Defining the jti claim The "jti" (JWT ID) claim provides a unique identifier for the JWT. This is used to create the key for the token in Redis. If you don't provide the "jti", a new one will be generated using [uuid](https://www.npmjs.com/package/uuid) version 4 (random). ```javascript const jwtRedis = new JwtRedis(client, {prefix: 'session:'}) const payload = {jti: 'test'}; // The key for the token in Redis will be "session:test" const secret = 'shhhhhh'; jwtRedis.sign(payload, secret, {expiresKeyIn: '1 hour'}).then((token) => { return jwtRedis.decode(token, secret); }).then((decoded) => { console.log(decoded.jti) // Will print "test" }); ``` # Touching the token When you set the jwt expiration time, you can't change it anymore. By using the option ````expiresKeyIn```` when you call ````sign````, you have the power to postpone the expiration time. ```javascript jwtRedis.sign(payload, secret, {expiresKeyIn: '1 hour'}).then((token) => { // Do what you need here }); // After 30 minutes... jwtRedis.touch(token).then(() => { // Now the token will be valid for more 1 hour. Without this the token would expire in 30 minutes. }); ``` # Destroying the token You can invalidate the token by calling ````destroy```` function. This will remove the key/value associated to the token from Redis. All future calls to ````verify```` will throw ````JwtRedis.TokenExpiredError````. ```javascript jwtRedis.destroy(token).then(() => { // The token was removed from Redis }); ``` # Promises All functions will return a Promise. You can set the Promise implementation by passing the option ````promiseImpl```` when you instantiate a new ````JwtRedis````. ```javascript const Promise = require('bluebird') const jwtRedis = new JwtRedis(redis, { promiseImpl: Promise, }); ``` # API Create a token ### jwtRedis.sign(payload, secretOrPrivateKey [, options]) ### Verify the token ### jwtRedis.verify(token, secretOrPublicKey [, options]) ### Decode the token ### jwt.decode(token [, options]) ### Postpone the token expiration ### jwtRedis.touch(token) ### Destroy the token ### jwtRedis.destroy(token) ###