jwt-express-roles

json web token for ( expressjs , socket.io ) using roles


Keywords
express, typescript, jwt, jsonwebtoken, roles, permission, socket.io, middleware, token, guard
Install
npm install jwt-express-roles@1.0.8

Documentation

jwt-express-roles npm link


Package Renamed From  [  jwt_experss_roles  ]  to  [  jwt-express-roles  ]


To Install

npm i jwt-express-roles -S

To Run Tests

git clone git@github.com:AhmedElMetwally/jwt-express-roles.git
cd jwt-express-roles/demo 
npm i
npm test

Example

user

var user = {
    _id : '41sa5d15sad15sa1d5s1d',
    name : 'name',
    email : 'email',
    anything : 'anything',

    // roleField
    roles : ['user'],
};

config

const JwtExpressRoles = require('jwt-express-roles');

// constructor
const jwt = new JwtExpressRoles({

    // ref to { roles : ['user'] }
    roleField : 'roles', // guard
    
    secretKey : process.env.JWT_SECRET || 'secretKey',
    expiresIn : '24h'

});


const express_user_guard = jwt.allaw_express({
    
    // required
    roles : ['user'],  // guard


    // optional
    dataField : '__user__', 
    // default _user
    // express request Function    
    // req['__user__']

    header_name_of_token : '__token__' // default token
    
});


const socket_io_user_guard = jwt.allaw_socket_io({

    // required 
    roles: ['user'], // guard
  

    // optional
    dataField : '__user__', 

    query_name_of_token : '__token__', // default token
    set_id_to_socket_from : '_id' // default _id

});
  
const express_handle_error = ( err , req , res , next ) => {
    
    if ( err.title === 'jwt-express-roles') {
      
        // error from jwt-express-roles
        res.status(400).json({
            error : err.message
        });

    } else {

        // error from express
        res.status( err.status ).json({
            error : err.message
        });

    };

};
  
module.exports = {
    jwt ,
    express_user_guard ,
    socket_io_user_guard ,
    express_handle_error
};

create token

const { jwt } = require('./config/jwt');

var user = {
    name : 'name',
    email : 'email',

    // roleField
    roles : ['user'],
};

jwt.create(user)
    .then( token => {
        console.log(token);
    })
    .catch( error => {
        console.log( error.message );
    });

middleware in expressJs

const { express_user_guard , express_handle_error } = require('./config/jwt');

// required req.headers['__token__'] 
app.use('/user' , express_user_guard , ( req , res ,next ) => {
    
   const user = req['__user__'];
    res.status(200).json({
        user :  user
    });

});

// required req.headers['__token__'] 
app.use('/user/profile' , express_user_guard , ( req , res ,next ) => {
    
    const user = req['__user__'];
    
    get_profile_by_user_id( user['_id'] ).then( profile => {
        
        // return data
        res.status(200).json({
            profile : profile
        });

    }).catch( err => {
    
        // return err to express_handle_error
        const error = {
            message : err.message,
            status : 401
        };
        next( error );

    })

});

app.use( express_handle_error );

middleware in socketIo

const { socket_io_user_guard } = require('./config/jwt');
const app = require('http').createServer( handler );
const io = require('socket.io')(app);
app.listen(80);


// required socket query __token__
io.use( socket_io_user_guard );

io.on('connection',  (socket) => {

    console.log('new connection');

    // socket['__user__']['_id'] === socket['_id'] === socket.id
    
    console.log( { socketId : socket['_id'] });
    console.log( { user     : socket['__user__']});

    socket.on('msg' , msg => {
        
        socket.emit('msg' , {

            user : socket['__user__'],
            id : socket.id,
            msg : msg

        });

    });

    socket.on('sent_to' , (event: any) => {

        io.to( event.receiver_id ).emit('sent_to' , {
            from : socket.id,
            message : event.message 
        });

    });
        
});

socketIo index.html

<script src="/socket.io/socket.io.js"></script>
<script>
  const token = 'sada4sadasdsadasas4adsad6sa6sf596f59d5f6ds54fsad';
  
    var socket = io.connect('http://localhost:80' , {
        query : {
            // ref to { query_name_of_token : '__token__' }
            __token__ : token
        }
    });

    socket.on('error' , error => {
        console.log({ error })
    });

    socket.on('msg' , msg => {
        console.log({ msg })
    });

    socket.on('sent_to' , event => {
        console.log('get message ' , {
            from : event.from,
            message : event.message
        });
    });


    setTimeout(() => {
        socket.emit('msg' , 'hello world');
    } , 3000 );

    setTimeout(() => {
        socket.emit('sent_to' , {
            receiver_id : 'any id user from DB',
            message : 'one to one message'
        });
    } , 5000 );
  
</script>