Pular para conteúdo

Express

API Gateway com Node.js e Express

Na Sprint 4, implementamos um API Gateway utilizando Node.js e Express, que atua como ponto de entrada para todos os microserviços.

// Exemplo de API Gateway com 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 não fornecido' });
    }

    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' });
    }
};

// Configuração de eventos para o proxy
const proxyEvents = {
    proxyReq: (proxyReq, req, res) => {
        if (req.user) {
            proxyReq.setHeader('x-user', JSON.stringify(req.user));
        }
    }
};

// Rotas públicas (sem autenticação)
app.use('/auth', createProxyMiddleware({
    target: 'http://usermanagement:8080',
    changeOrigin: true,
    pathRewrite: { '^/auth': '/auth' },
    logger: console
}));

// Middleware de autenticação para rotas protegidas
app.use(validateJwt);

// Rotas 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 tratar rotas não encontradas
app.use((req, res) => {
    res.status(404).json({ message: 'Rota não encontrada' });
});

// Iniciar o servidor
app.listen(PORT, () => {
    console.log(`API Gateway rodando na porta ${PORT}`);
});