Cómo Implementar un Sistema de Autenticación con JSON Web Tokens (JWT) en Node.js

Introducción

En el mundo actual de la programación web, la seguridad es primordial. Uno de los métodos más populares para manejar la autenticación de usuarios es el uso de JSON Web Tokens (JWT). En este artículo, aprenderemos cómo integrar JWT en una aplicación Node.js para gestionar el acceso de los usuarios de forma segura y eficiente.

¿Qué es JWT?

JSON Web Token es un estándar abierto que define un formato compacto y autocontenido para transmitir información de manera segura entre partes como un objeto JSON. Esta información puede ser verificada y confiada, ya que está firmada digitalmente.

Cómo Funciona JWT

Un JWT se compone de tres partes:

  • Header: Contiene información sobre cómo se firma el token.
  • Payload: Contiene las reclamaciones o la información que se desea transmitir.
  • Signature: Se utiliza para verificar que el emisor del token es quien dice ser y para asegurar que el mensaje no fue modificado.

Configuración del Proyecto

Para comenzar, necesitamos crear un nuevo proyecto con Node.js. Asegúrate de tener Node.js y NPM instalados en tu máquina:

mkdir jwt-auth
cd jwt-auth
npm init -y
npm install express jsonwebtoken dotenv

Crear el Servidor

Crea un archivo server.js y añade el siguiente código:

const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
const dotenv = require('dotenv');

dotenv.config();

app.use(express.json());

app.listen(3000, () => {
    console.log('Servidor ejecutándose en el puerto 3000');
});

Crear Rutas de Autenticación

A continuación, vamos a crear una ruta para el registro y otra para la autenticación:

app.post('/register', (req, res) => {
    // Aquí puedes agregar la lógica para registrar un usuario
});

app.post('/login', (req, res) => {
    const username = req.body.username;
    const user = { name: username };
    const token = jwt.sign({ user }, process.env.TOKEN_SECRET, { expiresIn: '1h' });
    res.json({ token });
});

Proteger Rutas con JWT

Finalmente, vamos a proteger algunas rutas utilizando un middleware para validar el token:

function authenticateToken(req, res, next) {
    const token = req.headers['authorization'];
    if (token == null) return res.sendStatus(401);

    jwt.verify(token, process.env.TOKEN_SECRET, (err, user) => {
        if (err) return res.sendStatus(403);
        req.user = user;
        next();
    });
}

app.get('/protected', authenticateToken, (req, res) => {
    res.json({ message: 'This is protected', user: req.user });
});

Conclusión

Hemos implementado un sistema de autenticación básico utilizando JSON Web Tokens en Node.js. Esta solución no solo mejora la seguridad de las aplicaciones web, sino que también facilita el manejo de las sesiones de usuario. Te animamos a que sigas investigando y mejorando tu sistema de autenticación.