Express
API Gateway con Node.js y Express
En el Sprint 4, implementamos un API Gateway utilizando Node.js y Express, que actúa como punto de entrada para todos los microservicios.
// Ejemplo de un API Gateway con Express
const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');
const jwt = require('jsonwebtoken');
const app = express();
const PORT = process.env.PORT || 80;
const SECRET_KEY = process.env.JWT_SECRET_KEY || '4Z^XrroxR@dWxqf$!@#qGr4P';
const ISSUER = process.env.JWT_ISSUER || 'user-api';
// Middleware para validar JWT
const validateJwt = (req, res, next) => {
const token = req.headers['authorization']?.split(' ')[1];
if (!token) {
return res.status(401).json({ message: 'Token no proporcionado' });
}
try {
const decoded = jwt.verify(token, SECRET_KEY, { issuer: ISSUER });
req.user = decoded.user;
next();
} catch (error) {
return res.status(401).json({ message: 'Token inválido' });
}
};
// Configuración de eventos para el proxy
const proxyEvents = {
proxyReq: (proxyReq, req, res) => {
if (req.user) {
proxyReq.setHeader('x-user', JSON.stringify(req.user));
}
}
};
// Rutas públicas (sin autenticación)
app.use('/auth', createProxyMiddleware({
target: 'http://usermanagement:8080',
changeOrigin: true,
pathRewrite: { '^/auth': '/auth' },
logger: console
}));
// Middleware de autenticación para rutas protegidas
app.use(validateJwt);
// Rutas protegidas
app.use('/users', createProxyMiddleware({
target: 'http://usermanagement:8080',
changeOrigin: true,
pathRewrite: { '^/users': '/users' },
on: proxyEvents,
logger: console
}));
app.use('/requests', createProxyMiddleware({
target: 'http://feedbackrequest:8082',
changeOrigin: true,
pathRewrite: { '^/requests': '/requests' },
on: proxyEvents,
logger: console
}));
app.use('/responses', createProxyMiddleware({target: 'http://feedbackresponse:8081',
changeOrigin: true,
pathRewrite: { '^/responses': '/responses' },
on: proxyEvents,
logger: console
}));
app.use('/responsesview', createProxyMiddleware({
target: 'http://feedbackresponseview:8000',
changeOrigin: true,
pathRewrite: { '^/responsesview': '/responsesview' },
on: proxyEvents,
logger: console
}));
// Middleware para manejar rutas no encontradas
app.use((req, res) => {
res.status(404).json({ message: 'Ruta no encontrada' });
});
// Iniciar el servidor
app.listen(PORT, () => {
console.log(`API Gateway corriendo en el puerto ${PORT}`);
});