Saltar a contenido

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 utiliza supertest y jest para verificar el comportamiento del proxy y la autenticación.

Funcionalidades

  1. 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.

  2. Middleware de Proxy: Las peticiones a la ruta /users se reenvían al servicio de gestión de usuarios. Durante el proxy, se agrega el header x-user, que contiene información extraída del JWT.

  3. 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

  1. Instala las dependencias con npm install.
  2. 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:

  1. Define el middleware: Utiliza el middleware JWT existente para proteger nuevas rutas, o crea uno nuevo si es necesario.

  2. Configura el Proxy: Usa createProxyMiddleware para definir nuevas reglas de proxy. Ejemplo:

    app.use('/nuevo-endpoint', createProxyMiddleware({
        target: 'http://nuevo-servicio:8080',
        changeOrigin: true,
        on: proxyEvents,
        logger: console
    }));
    
  3. Prueba el Endpoint: Crea pruebas utilizando supertest en el archivo app.spec.ts para 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 .env a process.env.