Skip to content

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

License

Notifications You must be signed in to change notification settings

bytesleo/redis-jwt

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

43 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

redis-jwt

NPM version Build Status dependencies Status devDependencies Status GitHub license

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

Requirements

  • Nodejs >= 6.x.x (Recommended 8.x.x)
  • Redis >= 3.x.x (Recommended 4.x.x)

Installation

Npm

npm install redis-jwt --save

Yarn

yarn add redis-jwt

Usage

import 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 }); });

Example Redis-jwt with Express

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!'));

Options

Sign

// 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...

Verify

// 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 })

Exec

// Execute Redis comands const exec = r.exec(); exec.rawCall(['keys', `507f191e810c19729de860ea:*`], (err, result) => { /*  [  "507f191e810c19729de860ea:ZYYlwOGqTmx",  "507f191e810c19729de860ea:d39K8J249Hd",  ] */ });

Call

// 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.. 

Events

// 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); });

Development

Start

npm start

Compile

npm run compile

Test

npm test

License

MIT © Leonardo Rico

About

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

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published