09 API Usuarios
09 API Usuarios
Lo que haremos:
• Crear la tabla de usuarios en MySQL.
• Registrar y autenticar usuarios con JWT.
• Asignar roles (admin, usuario).
• Proteger las rutas (GET, POST, PUT, DELETE) según los permisos.
• Probar la autenticación con Postman o en un frontend.
Instalar Librerías Necesarias
Ejecuta estos comandos en la terminal:
USE miDB;
CREATE TABLE usuarios (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
rol ENUM('admin', 'usuario') NOT NULL
DEFAULT 'usuario'
);
INSERT INTO usuarios (nombre, email, password, rol) VALUES ('Admin', '[email protected]',
'$2a$10$XwG/bF7JvM2tQOg4x9qgZe6a5HcvzJv8CTOvGf.5A3nri1d8lfGSi', 'admin');
Nota:
La contraseña aquí es "admin123", pero está cifrada con bcryptjs.
Configurar la Autenticación en Express
Añade estas rutas en server.js
require('dotenv').config();
const mysql = require('mysql2');
const express = require('express');
const cors = require('cors');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
app.use(cors());
app.use(express.json());
Configurar la Autenticación en Express
Añade estas rutas en server.js
// Conectar a MySQL
const conexion = mysql.createConnection({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME
});
conexion.connect(error => {
if (error) {
console.error("Error de conexión a MySQL:", error);
return;
}
console.log("Conectado a MySQL");
});
// Cifrar la contraseña
const hashedPassword = await bcrypt.hash(password, 10);
Registrar Usuarios (POST /register)
Añade esta ruta para registrar usuarios:
// Cifrar la contraseña
const hashedPassword = await bcrypt.hash(password, 10);
conexion.query('SELECT * FROM usuarios WHERE email = ?', [email], async (error, resultados) => {
if (resultados.length === 0) {
return res.status(401).json({ mensaje: "Usuario no encontrado" });
}
if (!passwordValida) {
return res.status(401).json({ mensaje: "Contraseña incorrecta" });
}
Iniciar Sesión (POST /login)
Añade esta ruta para autenticar usuarios y generar un token:
if (!token) {
return res.status(403).json({ mensaje: "Token requerido" });
}
if (!token) {
return res.status(403).json({ mensaje: "Token requerido" });
}
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Gestión de Productos</title>
</head>
<body>
<h1>Iniciar Sesión</h1>
<form id="loginForm">
<input type="email" id="email" placeholder="Correo electrónico" required>
<input type="password" id="password" placeholder="Contraseña" required>
<button type="submit">Ingresar</button>
</form>
Modificar index.html para Incluir
Registro e Inicio de Sesión
Abre tu index.html y agrega los siguientes formularios:
<h1>Registrar Usuario</h1>
<form id="registerForm">
<input type="text" id="nombre" placeholder="Nombre" required>
<input type="email" id="regEmail" placeholder="Correo electrónico" required>
<input type="password" id="regPassword" placeholder="Contraseña" required>
<select id="rol">
<option value="usuario">Usuario</option>
<option value="admin">Administrador</option>
</select>
<button type="submit">Registrar</button>
</form>
Modificar index.html para Incluir
Registro e Inicio de Sesión
Abre tu index.html y agrega los siguientes formularios:
<h1>Lista de Productos</h1>
<ul id="productos"></ul>
<script src="app.js"></script>
</body>
</html>
Modificar app.js para Manejar
Autenticación
Ahora en app.js, debemos hacer las peticiones al backend para login y registro.
document.addEventListener("DOMContentLoaded", () => {
const loginForm = document.getElementById("loginForm");
const registerForm = document.getElementById("registerForm");
// Iniciar sesión
loginForm.addEventListener("submit", async (e) => {
e.preventDefault();
const email = document.getElementById("email").value;
const password = document.getElementById("password").value;
if (response.ok) {
localStorage.setItem("token", data.token);
alert("Inicio de sesión exitoso");
cargarProductos();
} else {
alert("Error: " + data.mensaje);
}
});
Modificar app.js para Manejar
Autenticación
Ahora en app.js, debemos hacer las peticiones al backend para login y registro.
// Registro de usuario
registerForm.addEventListener("submit", async (e) => {
e.preventDefault();
const nombre = document.getElementById("nombre").value;
const email = document.getElementById("regEmail").value;
const password = document.getElementById("regPassword").value;
const rol = document.getElementById("rol").value;
if (response.ok) {
alert("Usuario registrado con éxito");
} else {
alert("Error: " + data.mensaje);
}
});
Modificar app.js para Manejar
Autenticación
Ahora//
enCargar
app.js, debemos hacer
productos las peticiones
desde la API al backend para login y registro.
async function cargarProductos() {
const token = localStorage.getItem("token");
const response = await fetch("http://localhost:3000/productos", {
headers: { "Authorization": `Bearer ${token}` },
});
productos.forEach((producto) => {
let item = document.createElement("li");
item.textContent = `${producto.nombre} - $${producto.precio}`;
lista.appendChild(item);
});
}
});
JWT (JSON Web Token)
JWT (JSON Web Token) es un estándar de autenticación segura que permite verificar la
identidad de un usuario sin necesidad de guardar su sesión en el servidor. Se usa ampliamente
en APIs REST, autenticación de usuarios y autorización de accesos.
Ejemplo de uso: Cuando un usuario inicia sesión en una web, el servidor le envía un token JWT, y
cada vez que haga una petición a la API, enviará ese token para demostrar que está autenticado.
Estructura de un Token JWT
Cada parte tiene un propósito específico:
Instrucciones
Configurar la base de datos MySQL
• Crear una base de datos llamada gestor_tareas.
• Crear la tabla tareas con los siguientes campos:
Gracias