API Gateway implementado con Node y Express
Este proyecto implementa un servidor proxy utilizando Express y http-proxy-middleware para reenviar peticiones a los servicios del backend. Además, utiliza JWTs (JSON Web Tokens) para autenticar y autorizar peticiones.
Estructura del Proyecto
app.ts: Archivo principal que configura el servidor Express, el middleware de autenticación JWT y la lógica de proxy.index.ts: Punto de entrada de la aplicación que inicia el servidor.app.spec.ts: Archivo de pruebas que utilizasupertestyjestpara verificar el comportamiento del proxy y la autenticación.
Funcionalidades
-
Autenticación JWT: El middleware verifica si se proporciona un JWT válido en el header
Authorization. Si el token es inválido o está ausente, la petición es bloqueada. -
Middleware de Proxy: Las peticiones a la ruta
/usersse reenvían al servicio de gestión de usuarios. Durante el proxy, se agrega el headerx-user, que contiene información extraída del JWT. -
Pruebas Automatizadas: El proyecto incluye pruebas para verificar el comportamiento de autenticación y proxy.
Configuración
Variables de Entorno
SECRET_KEY: Clave secreta para firmar y verificar JWTs. Debe definirse en el archivo.env.USER_MANAGEMENT_API: URL del servicio de gestión de usuarios.PORT: Puerto en el que se ejecutará el servidor Express.
Iniciando el Servidor
- Instala las dependencias con
npm install. - Ejecuta el servidor con
npm start.
Pruebas
Las pruebas se realizan utilizando jest y supertest. Para ejecutar las pruebas, utiliza:
npm test
Ejemplos de Uso
Petición con JWT Válido
curl -H "Authorization: Bearer <token_jwt_valido>" http://localhost:<PORT>/users
Petición sin JWT
curl http://localhost:<PORT>/users
Nota: La petición sin un JWT válido retornará un error 403 o 401.
Agregando Nuevos Endpoints
Para agregar nuevos endpoints, sigue estos pasos:
-
Define el middleware: Utiliza el middleware JWT existente para proteger nuevas rutas, o crea uno nuevo si es necesario.
-
Configura el Proxy: Usa
createProxyMiddlewarepara definir nuevas reglas de proxy. Ejemplo:app.use('/nuevo-endpoint', createProxyMiddleware({ target: 'http://nuevo-servicio:8080', changeOrigin: true, on: proxyEvents, logger: console })); -
Prueba el Endpoint: Crea pruebas utilizando
supertesten el archivoapp.spec.tspara verificar el comportamiento.
Ejemplo de Prueba con TDD
Para crear una prueba basada en TDD, sigue este ejemplo:
it('debe retornar 404 para una ruta inexistente', async () => {
const response = await request(app).get('/ruta-inexistente');
expect(response.status).toBe(404);
});
Glosario
- JWT (JSON Web Token): Un estándar de token abierto que permite la transmisión segura de información entre partes como un objeto JSON.
- Middleware: Funciones que tienen acceso al objeto de petición (req), al objeto de respuesta (res) y a la siguiente función middleware en el ciclo de petición-respuesta.
- Proxy: Un intermediario para peticiones de clientes que buscan recursos de otros servidores.
- Express: Un framework para Node.js que proporciona un conjunto robusto de características para aplicaciones web y móviles.
http-proxy-middleware: Un middleware para Node.js que actúa como un proxy inverso, enrutando peticiones a diferentes servidores.supertest: Una biblioteca para probar aplicaciones HTTP usando Node.js.dotenv: Un módulo que carga variables de entorno de un archivo.envaprocess.env.