Skip to main content

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'utente
  • ctx.meta.user.roles: array dei ruoli assegnati
  • ctx.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 autorizzate
  • Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
  • Access-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

Questa pagina ti è stata utile?