Introducción al Error CORS en el Desarrollo Web
Uno de los dolores de cabeza más comunes para los desarrolladores frontend y backend es el temido error de CORS (Cross-Origin Resource Sharing). Este mecanismo de seguridad implementado por los navegadores web bloquea las peticiones HTTP realizadas desde un dominio, puerto o protocolo diferente al del servidor de recursos, protegiendo así a los usuarios contra ataques maliciosos de falsificación de peticiones.
Causas Principales del Bloqueo CORS
- Intentar consumir una API desde un dominio diferente (ej.
http://localhost:3000ahttp://localhost:5000) sin la debida autorización. - Falta de las cabeceras HTTP necesarias en las respuestas del servidor backend.
- Configuración incorrecta de proxys inversos o navegadores en entornos de desarrollo local.
Método 1: Solucionar CORS en Node.js usando el paquete Express
La forma más rápida y recomendada de habilitar CORS en una API construida con Node.js y Express es utilizando el middleware oficial cors.
- Instala el paquete en tu proyecto ejecutando el siguiente comando en tu terminal:
npm install cors - Importa y configura el middleware en tu archivo principal de servidor (por ejemplo,
server.jsoapp.js):const express = require('express');const cors = require('cors');const app = express();app.use(cors()); - Si necesitas restringir el acceso únicamente a un dominio específico en producción, configura las opciones de la siguiente manera:
const corsOptions = { origin: 'https://tu-dominio-frontend.com' };app.use(cors(corsOptions));
Método 2: Configurar Cabeceras HTTP Manualmente en el Servidor
Si no estás utilizando un framework como Express y manejas servidores HTTP nativos en Node.js o PHP, debes añadir las cabeceras correspondientes manualmente en cada respuesta saliente.
- Ubica el archivo que gestiona las respuestas HTTP de tu API.
- Añade las siguientes cabeceras antes de enviar la respuesta al cliente:
res.setHeader('Access-Control-Allow-Origin', '*');res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization'); - Asegúrate de manejar correctamente las peticiones preliminares de tipo
OPTIONSque envían los navegadores antes de realizar peticiones complejas.