Generar un JSON Web Token (JWT) en NodeJS

Hoy os traigo una publicación sobre el uso de JSON Web Token en uno de nuestros proyectos para generar, en la función de login, un token que se pueda validar posteriormente antes de hacer una acción, por ejemplo de actualizado de usuarios.

Utilizaremos esta tecnología porque utiliza el algoritmo de encriptación HS256 y además, para generar el token se basa en una semilla (seem) que nos podemos inventar o generar, sin la cual, no se puede descifrar la información que contiene el token. Todo esto hace que sea uno de los procesos más seguros de tokerizado.

Para ello vamos a instalar el paquete de node para jsonwebtoken con el siguiente comando:

npm install jsonwebtoken --save

Después para usarlo en nuestro código, vale con importar el paquete y llamar a su función sign de la siguiente manera:

const jwt = require('jsonwebtoken');

let token = jwt.sign({
    infoUser
}, 'este-es-el-seed', {expiresIn: '48h'});

El token que genera la siguiente función tendrá una duración de 48 horas, dos días, y utilizará la semilla este-es-el-seed para encriptar la información de usuario.

Si quieres usarlo en una función login podría ser algo así:

const express = require('express');
// Usamos bcrypt para comprobar la contraseña
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
// Importamos el modelo de usuario de otro fichero
const User = require('./models/User');
const app = express();

app.post('/login', (req, res) =>{
    
    let body = req.body;

    User.findOne({email: body.email}, (err, user) => {
        if(err){
            return res.status(500).json({
               ok: false,
               err  
            });
        }

        if(!user){
            return res.status(400).json({
                ok: false,
                err: {
                    message: 'Usuario o contraseña incrorrectos'
                }
            });
        }

        if(!bcrypt.compareSync(body.password, user.password)){
            return res.status(400).json({
                ok: false,
                err: {
                    message: 'Usuario o contraseña incrorrectos'
                }
            });
        }

        let token = jwt.sign({
            user
        }, 'este-es-el-seed', {expiresIn: '48h'});

        res.json({
            ok: true,
            user,
            token
        });

    });
});

En la respuesta correcta de la función de login, nuestro servidor de NodeJS va a devolver la información de nuestro usuario, que la habremos definido previamente en nuestro modelo, y el token. La capa frontend ya puede guardar ese token como variable local de navegador y deberá mandarlo con el resto de peticiones para validar que el usuario creado puede ejecutar esas funciones.