API Gateway: Routing, Auth e Rate Limiting
Panoramica
L'API Gateway (api.service.js) e il punto di ingresso unico per tutte le richieste HTTP verso il backend. Basato su moleculer-web, espone endpoint REST che vengono automaticamente mappati alle azioni dei microservizi interni. Gestisce autenticazione, autorizzazione, CORS e rate limiting.
Routing Automatico
Il gateway sfrutta il service discovery di Moleculer per mappare automaticamente le azioni dei servizi a endpoint REST. Le convenzioni di routing seguono il pattern:
GET /api/{servizio} → {servizio}.list
GET /api/{servizio}/:id → {servizio}.get
POST /api/{servizio} → {servizio}.create
PUT /api/{servizio}/:id → {servizio}.update
DELETE /api/{servizio}/:id → {servizio}.remove
Le azioni personalizzate vengono esposte come alias espliciti nella configurazione del gateway. Questo garantisce che solo le azioni autorizzate siano raggiungibili dall'esterno.
Autenticazione a 3 Step
Il metodo authenticate del gateway implementa una catena di validazione a tre livelli, eseguiti in ordine:
Step 1: Token HS256 (Device/Operatore)
Verifica i JWT firmati con chiave simmetrica HS256 e issuer pos-backend. Questi token vengono generati dal backend per dispositivi registrati e operatori. Il payload contiene tenantId, deviceId e i ruoli dell'operatore.
Step 2: Token HS256 (Supporto)
Verifica i JWT con issuer pos-backend-support, emessi per le sessioni di accesso dei tecnici manutentori. Oltre alla validazione del token, questo step:
- Controlla che la sessione di supporto sia ancora attiva
- Verifica il JTI (JSON Token ID) contro la blacklist di revoca
- Valida il device binding tramite header
X-Device-ID
Step 3: Token RS256 (Keycloak)
Verifica i JWT firmati asimmetricamente da Keycloak (RS256). Estrae tenantId dal claim personalizzato e i ruoli da realm_access.roles. Questo metodo e utilizzato dalla console admin e dalle applicazioni web.
Se nessuno dei tre step ha successo, la richiesta viene rifiutata con errore 401.
Contesto della Richiesta
Dopo l'autenticazione, il gateway popola ctx.meta con le informazioni dell'utente:
ctx.meta.tenantId: identificativo del tenant (ristorante)ctx.meta.user.id: identificativo univoco dell'utentectx.meta.user.roles: array dei ruoli assegnatictx.meta.deviceId: identificativo del dispositivo (per token HS256)
Tutti i servizi a valle ricevono automaticamente queste informazioni tramite il contesto Moleculer.
CORS e Headers
Il gateway configura CORS per consentire richieste cross-origin dalla console admin e dalle applicazioni web. Gli header configurati includono:
Access-Control-Allow-Origin: origini autorizzateAccess-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONSAccess-Control-Allow-Headers: Authorization, Content-Type, X-Device-ID
Rate Limiting
Il gateway implementa rate limiting per proteggere i servizi da abusi:
- Limite globale: massimo numero di richieste per IP per finestra temporale
- Limite per rotta: soglie specifiche per endpoint sensibili (es. login, generazione token)
- Whitelist: IP interni e servizi di monitoraggio esenti dal limite
SSE Streaming
Per le funzionalita che richiedono aggiornamenti push dal server (es. stato ordini in cucina), il gateway supporta Server-Sent Events (SSE). Il client apre una connessione persistente e riceve eventi in tempo reale senza polling.
Modalita Sviluppo
In ambiente di sviluppo, impostando SKIP_AUTH=true nel file .env, il gateway bypassa la validazione JWT e utilizza DEV_TENANT_ID come tenant di default. Questo semplifica il testing locale senza necessita di un'istanza Keycloak.
FAQ
D: Come aggiungo un nuovo endpoint personalizzato?
R: Aggiungere un alias nella sezione routes di api.service.js. Specificare il metodo HTTP, il path e l'azione Moleculer corrispondente. L'azione deve essere dichiarata nel servizio target.
D: Come testo le API senza autenticazione?
R: Impostare SKIP_AUTH=true e DEV_TENANT_ID=demo nel file .env. Tutte le richieste verranno associate al tenant "demo" senza validazione JWT.
D: Il rate limiting si applica anche in modalita sviluppo?
R: No, in modalita sviluppo (NODE_ENV=development) il rate limiting e disabilitato per facilitare il testing.
Vedi Anche
- Token HS256 vs RS256 -- Dettagli sui formati JWT
- Flusso di Autenticazione -- Flusso completo di autenticazione
- Architettura Microservizi -- Struttura del backend
- Mixin Database -- Come i servizi accedono ai dati