Management of sessions by Redis and JWT for horizontal scalability, with the possibility of having one session at a time or multiple for the same user
Npm
npm install redis-jwt --saveYarn
yarn add redis-jwtimport RedisJwt from 'redis-jwt'; const r = new RedisJwt({ //host: '/tmp/redis.sock', //unix domain host: '127.0.0.1', //can be IP or hostname port: 6379, // port maxretries: 10, //reconnect retries, default 10 //auth: '123', //optional password, if needed db: 0, //optional db selection secret: 'secret_key', // secret key for Tokens! multiple: false, // single or multiple sessions by user kea: false // Enable notify-keyspace-events KEA }); r.sign('507f191e810c19729de860ea').then(token => { r.verify(token).then(decode => { // [Object] }).catch(err => { // Wrong token }); });import RedisJwt from 'redis-jwt'; import express from 'express'; const r = new RedisJwt(); const app = express(); // Login app.get('/login', (req, res) => { r.sign('507f191e810c19729de860ea', { ttl: '15 minutes', dataToken: { // Public hello: 'world' }, dataSession: { // Private hello: 'world', headers : req.headers } } }).then(token => { res.json({token}); }); }); // Me app.get('/me', mw(), (req, res) => { res.json(req.user); }); // Middleware function mw() { return (req, res, next) => { const token = req.headers['authorization']; r.verify(token).then(decode => // here you can get user from DB by id (decode.id) req.user = decode; next(); }).catch(err => { res.status(401).json({err}) }) } } app.listen(3000, () => console.log('Server listening on port 3000!'));// Basic r.sign('507f191e810c19729de860ea').then.. // TTL : 50 seconds, 10 minutes, 5 hours, 3 days, 1 year ... r.sign('507f191e810c19729de860ea', { ttl: '15 minutes' }).then... // Save data in token : Object are saved in token r.sign('507f191e810c19729de860ea', { dataToken: {world: 'hello'} }).then... // Save data in redis : Object are saved in redis-jwt r.sign('507f191e810c19729de860ea', { dataSession: {hello: 'world'} }).then... // Example TTL + dataToken + dataSession r.sign('507f191e810c19729de860ea', { ttl: '15 minutes', dataToken: {world: 'hello'}, dataSession: {hello: 'world'} }).then...// Basic r.verify(token).then(decode => { /* { "rjwt": "507f191e810c19729de860ea:ZYYlwOGqTmx", "dataToken": [Object] "iat": 1504334208, "id": "507f191e810c19729de860ea", "ttl": 60 } */ }).catch(err => { // Wrong token }) // Get data from redis r.verify(token, true).then(decode => { /* { "rjwt": "507f191e810c19729de860ea:ZYYlwOGqTmx", "dataToken": [Object] "dataSession": [Object] ----> get data session "iat": 1504334208, "id": "507f191e810c19729de860ea", "ttl": 60 } */ }).catch(err => { // Wrong token })// Execute Redis comands const exec = r.exec(); exec.rawCall(['keys', `507f191e810c19729de860ea:*`], (err, result) => { /* [ "507f191e810c19729de860ea:ZYYlwOGqTmx", "507f191e810c19729de860ea:d39K8J249Hd", ] */ });// Method's redis-jwt const call = r.call(); // Test Ping call.ping().then.. // Create call.create(key, value, ttl).then.. // exits by key call.exists(key).then.. // Get ttl by Key call.ttl(key).then.. // Get values by key call.getValueByKey(key).then.. // Get values by Pattern call.getValuesByPattern(pattern).then.. // Get count by Pattern call.getCountByPattern(pattern).then.. // Get info call.getInfo(section).then.. // Destroy by key call.destroy(key).then.. // Destroy multiple by key call.destroyMultiple(key).then.. // Ready r.on('ready', () => { console.log('redis-jwt-> ready!'); }); // connected r.on('connected', () => { console.log('redis-jwt-> connected!'); }); // disconnected r.on('disconnected', () => { console.log('redis-jwt-> disconnected!'); }); // error r.on('error', (err) => { console.log('redis-jwt-> error!', err); });npm start
npm run compile
npm test
MIT © Leonardo Rico

