Está en la página 1de 6

Tutorial: uso de JWT

mrea@utn.edu.ec - 2022

Fuentes:

https://asfo.medium.com/autenticando-un-api-rest-con-nodejs-y-jwt-json-web-tokens-
5f3674aba50e

https://openwebinars.net/blog/que-es-json-web-token-y-como-funciona/

Requisitos previos
Tener una instalación de nodejs y vsc

Qué es JWT?
JWT (JSON Web Token) es un estándar qué está dentro del documento RFC 7519.

En el mismo se define un mecanismo para poder propagar entre dos partes, y de forma segura,
la identidad de un determinado usuario, además con una serie de claims o privilegios.

Estos privilegios están codificados en objetos de tipo JSON, que se incrustan dentro de del
payload o cuerpo de un mensaje que va firmado digitalmente.

El token JWT tiene tres partes codificadas en Base64, cada una separada por un punto. Puede
comprobarse en https://jwt.io/

Estas partes son:

Header: encabezado dónde se indica, al menos, el algoritmo y el tipo de token, por


ejemplo el algoritmo HS256 y un token de tipo JWT.
Payload: donde aparecen los datos de usuario y privilegios, así como toda la información
que queramos añadir, todos los datos que creamos convenientes.
Signature: una firma que nos permite verificar si el token es válido.

Para asegurar que este intercambio de información sea cifrada, debe usarse HTTPS.

Mecanismo
El mecanismo de autenticación y autorización mediante JWT es el siguiente:
Creación del proyecto
Crear una carpeta jwt e instalar express y jsonwebtoken y luego abrir el proyecto con vsc:

mkdir jwt
cd jwt
npm install --save express jsonwebtoken
touch index.js
mkdir configs
touch configs/config.js
code .
Editar el archivo config.js

module.exports = {
llave: "swempresarial2022*"
}

Editar el archivo index.js


const express = require('express'),
bodyParser = require('body-parser'),
jwt = require('jsonwebtoken'),
config = require('./configs/config'),
app = express();

app.set('llave', config.llave);
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

app.listen(3000, () => {
console.log('Servidor iniciado en el puerto 3000 http://localhost:3000')
});

app.get('/', function (req, res) {


res.send('Inicio ok');
});

//login:
app.post('/autenticar', (req, res) => {
if (req.body.usuario === "curso" && req.body.contrasena === "holamundo") {
const payload = {
check: true
};
const token = jwt.sign(payload, app.get('llave'), {
expiresIn: 1440
});
res.json({
mensaje: 'Autenticación correcta.',
token: token
});
} else {
res.json({ mensaje: "Usuario o contraseña incorrectos." })
}
})

//middleware:
const rutasProtegidas = express.Router();
rutasProtegidas.use((req, res, next) => {
const token = req.headers['access-token'];

if (token) {
jwt.verify(token, app.get('llave'), (err, decoded) => {
if (err) {
return res.json({ mensaje: 'Token incorrecto.' });
} else {
req.decoded = decoded;
next();
}
});
} else {
res.send({
mensaje: 'Debe indicar un token.'
});
}
});

//api:
app.get('/datos', rutasProtegidas, (req, res) => {
const datos = [
{ id: 1, nombre: "Luisa" },
{ id: 2, nombre: "Sergio" },
{ id: 3, nombre: "Carlos" }
];

res.json(datos);
});

Ejecutar el servidor:

node index.js

Se puede acceder al servidor:

Para comprobar la autenticación, utilizar un cliente de API REST. En este caso usamos el
plugin "RESTED" de Firefox:
Luego con el token devuelto, ya se puede acceder a los endpoints restringidos:

También podría gustarte