En el mundo actual del desarrollo web, las aplicaciones requieren un sistema robusto de autenticación que permita manejar de manera segura los accesos de los usuarios. En este contexto, la implementación de un sistema basado en JSON Web Tokens (JWT) se ha vuelto un enfoque popular debido a su simplicidad y eficacia. Este tutorial se enfoca en enseñarte cómo crear una API REST utilizando Node.js y Express, implementando la autenticación JWT.
¿Qué es JWT?
JSON Web Token (JWT) es un estándar abierto (RFC 7519) que define un formato compacto y autónomo para transmitir información entre partes como un objeto JSON. Esta información puede ser verificada y firmada digitalmente, lo cual lo hace ideal para la autenticación y el intercambio seguro de datos.
Requisitos Previos
Antes de iniciar, asegúrate de tener instalado Node.js en tu máquina. Adicionalmente, necesitarás algunas herramientas básicas de desarrollo:
- Node.js: Para ejecutar JavaScript en el servidor.
- Express: Un marco de trabajo que facilita la creación de aplicaciones web.
- Postman o Insomnia: Para probar las solicitudes a nuestra API.
- MongoDB: Sistema de base de datos NoSQL donde almacenaremos usuarios (opcional).
Creando el Proyecto
Primero, crea una nueva carpeta para tu proyecto y navega hacia ella desde la terminal:
$ mkdir jwt-auth-api
$ cd jwt-auth-api
A continuación, inicializa un nuevo proyecto de Node.js ejecutando el siguiente comando:
$ npm init -y
Añade las dependencias necesarias:
$ npm install express mongoose jsonwebtoken bcryptjs dotenv
Estructura del Proyecto
Crea la siguiente estructura dentro de tu carpeta del proyecto:
jwt-auth-api/
??? .env
??? app.js
??? models/
??? User.js
Archivo .env
Crea un archivo llamado .env para almacenar variables sensibles como la clave secreta para firmar nuestros tokens:
JWT_SECRET=myverysecuresecret
Modelo de Usuario
Crea el modelo de usuario dentro de /models/User.js. Este modelo se encargará de definir el esquema para nuestra base de datos:
const mongoose = require(mongoose);
const bcrypt = require(bcryptjs);
const UserSchema = new mongoose.Schema({
username: { type: String, required: true },
password: { type: String, required: true }
});
UserSchema.pre(save, async function(next) {
if (!this.isModified(password)) return next();
this.password = await bcrypt.hash(this.password, 10);
next();
});
module.exports = mongoose.model(User, UserSchema);
Código Principal en app.js
A continuación, establece conexiones y define las rutas en app.js:
const express = require(express);
const mongoose = require(mongoose);
const jwt = require(jsonwebtoken);
const User = require(./models/User);
dotenv.config();
const app = express();
appp.use(express.json());
mongoose.connect(mongodb://localhost/jwt-auth, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
app.post(/register, async (req, res) => {
const { username, password } = req.body;
bconst user = new User({ username, password });
aawait user.save();
rres.status(201).json(user);
n});
avv.post(/login, async (req, res) => {
pconst { username, password } = req.body;
tconst user = await User.findOne({ username });
sif (!user ||
)) {
nres.status(401).send(Credenciales inválidas);
g}
dtkn = jwt.sign({ id: user._id }, process.env.JWT_SECRET);
sres.json({ token });
n});
dapp.listen(3000, () => {
cconsole.log(Server running on port 3000);
c});
n
"> torntorln precisaonseresi ://gómico!sublime /aptodo viogato hecho da petor desde e completori ??????c?????????
enbdirémonos pconexáto o por prioreciéndo??????????