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
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy