Skip to Content

API Webhook

I webhook consentono alla tua applicazione di ricevere callback HTTP in tempo reale quando si verificano eventi in Auris. Quando scatta un evento sottoscritto (es. un utente accede, viene assegnato un ruolo, un account viene bloccato), Auris invia una richiesta POST al tuo URL configurato con un payload JSON che descrive l’evento.

Ogni consegna webhook viene firmata con HMAC-SHA256 usando un secret di firma specifico per webhook. Questo consente al tuo server di verificare che il payload provenisse da Auris e non sia stato manomesso durante il transito.

Tutti gli endpoint di gestione webhook richiedono il permesso manage:webhooks e l’header x-tenant.

CRUD Webhook

Elenco Webhook

GET/api/webhooksRequires: manage:webhooks

Elenca tutti gli endpoint webhook configurati per il tenant. Restituisce i metadati del webhook inclusi gli eventi sottoscritti, lo stato attivo e le statistiche di errore. Il secret di firma non viene mai restituito nelle risposte di elenco.

Risposta di successo

{ "ok": true, "data": { "data": [ { "id": "whk_abc123", "name": "Gestore Eventi Produzione", "url": "https://api.tuaapp.it/webhooks/auris", "events": ["user.created", "user.updated", "login.success", "login.failed"], "isActive": true, "lastDeliveryAt": "2025-02-18T09:45:00Z", "failureCount": 0, "createdAt": "2025-01-15T10:00:00Z" } ], "pagination": { "page": 1, "limit": 20, "total": 3, "totalPages": 1 } } }

Crea Webhook

POST/api/webhooksRequires: manage:webhooks

Crea un nuovo endpoint webhook. Un secret di firma viene generato automaticamente con prefisso whsec_. Il secret viene restituito solo nella risposta di creazione — conservalo in modo sicuro, poiché non può essere recuperato in seguito (solo ruotato).

Corpo della richiesta

{ "name": "Gestore Eventi Produzione", "url": "https://api.tuaapp.it/webhooks/auris", "events": ["user.created", "user.updated", "user.deleted", "login.success"] }
CampoTipoObbligatorioDescrizione
namestringSìNome leggibile per questo webhook
urlstringSìURL endpoint HTTPS che riceverà richieste POST
eventsstring[]SìArray di tipi di evento a cui sottoscriversi (vedi Tipi di Evento)

Gli URL webhook devono usare HTTPS. Gli URL HTTP vengono rifiutati per evitare che secret e dati utente vengano trasmessi in chiaro.

Risposta di successo

{ "ok": true, "data": { "id": "whk_def456", "name": "Gestore Eventi Produzione", "url": "https://api.tuaapp.it/webhooks/auris", "events": ["user.created", "user.updated", "user.deleted", "login.success"], "secret": "whsec_7f3a8b2c4d5e6f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f", "isActive": true, "createdAt": "2025-02-18T10:00:00Z" } }

Il campo secret viene restituito solo nella risposta di creazione e dopo la rotazione del secret. Copialo e conservalo immediatamente in un luogo sicuro (es. variabile d’ambiente o gestore dei secret). Non può essere recuperato di nuovo.

Codici di errore

CodiceHTTPDescrizione
VALIDATION_ERROR400Campi obbligatori mancanti o tipi di evento non validi
INVALID_URL400L’URL non è un endpoint HTTPS valido
INVALID_EVENTS400Uno o più tipi di evento non sono riconosciuti

Aggiorna Webhook

PATCH/api/webhooks/[id]Requires: manage:webhooks

Aggiorna il nome, l’URL, gli eventi sottoscritti o lo stato attivo di un webhook. Tutti i campi sono opzionali — vengono aggiornati solo i campi forniti.

Corpo della richiesta

{ "name": "Gestore Eventi Produzione v2", "events": ["user.created", "user.updated", "user.deleted", "login.success", "login.failed", "role.assigned"], "isActive": true }

Elimina Webhook

DELETE/api/webhooks/[id]Requires: manage:webhooks

Elimina un endpoint webhook. Le consegne in sospeso per questo webhook vengono annullate. La cronologia delle consegne viene conservata a fini di audit.

Risposta di successo

{ "ok": true, "data": { "deleted": true } }

Rotazione Secret

POST/api/webhooks/[id]/rotate-secretRequires: manage:webhooks

Genera un nuovo secret di firma per il webhook. Il vecchio secret viene immediatamente invalidato. Il nuovo secret viene restituito nella risposta. Tutte le consegne successive saranno firmate con il nuovo secret.

Richiesta: Nessun corpo richiesto.

Risposta di successo

{ "ok": true, "data": { "secret": "whsec_9a8b7c6d5e4f3a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a" } }

Dopo la rotazione del secret, aggiorna immediatamente il tuo gestore webhook per usare il nuovo secret. Le consegne in volo al momento della rotazione potrebbero ancora usare il vecchio secret. Best practice: supporta la verifica sia del vecchio che del nuovo secret per un breve periodo di grazia durante la rotazione.

Test

POST/api/webhooks/[id]/testRequires: manage:webhooks

Invia una consegna di test all’URL webhook. Auris invia un evento webhook.test con un payload di esempio. La consegna viene registrata nel log di consegna. Usalo per verificare che il tuo endpoint sia raggiungibile e stia verificando correttamente le firme.

Payload dell’evento di test (cosa riceve il tuo endpoint)

{ "event": "webhook.test", "timestamp": "2025-02-18T10:30:00Z", "tenant": "acme-corp", "data": { "message": "Questa è una consegna di test da Auris.", "webhookId": "whk_abc123" } }

Log di Consegna

Elenco Consegne

GET/api/webhooks/[id]/deliveriesRequires: manage:webhooks

Elenca i tentativi di consegna per un webhook, ordinati per timestamp in ordine decrescente. Ogni consegna include il tipo di evento, il codice di stato HTTP, il tempo di risposta e se la consegna ha avuto successo. Le consegne riteritrate sono voci separate collegate allo stesso evento.

Risposta di successo

{ "ok": true, "data": { "data": [ { "id": "del_abc123", "event": "user.created", "statusCode": 200, "success": true, "responseTime": 89, "attempts": 1, "payload": { "event": "user.created", "timestamp": "2025-02-18T09:45:00Z", "tenant": "acme-corp", "data": { "userId": "usr_abc123", "email": "[email protected]" } }, "createdAt": "2025-02-18T09:45:00Z", "completedAt": "2025-02-18T09:45:01Z" } ], "pagination": { "page": 1, "limit": 20, "total": 156, "totalPages": 8 } } }

Riprova Consegna

POST/api/webhooks/[id]/deliveries/[deliveryId]/retryRequires: manage:webhooks

Riprova manualmente una consegna fallita. Il payload originale viene ri-inviato con una nuova firma. Crea una nuova voce di consegna collegata allo stesso evento.

Tipi di Evento

Auris emette i seguenti eventi webhook. Sottoscrivi gli eventi rilevanti per il tuo caso d’uso.

Eventi di Autenticazione

EventoDescrizione
login.successUtente autenticato con successo (qualsiasi metodo)
login.failedTentativo di autenticazione fallito (credenziali errate, account bloccato, ecc.)
signup.completedNuovo account utente registrato
logout.completedUtente disconnesso (sessione invalidata)
token.refreshedAccess token aggiornato
password.changedUtente ha cambiato la propria password
password.reset_requestedEmail di reset password inviata
magic_link.sentEmail con magic link inviata
magic_link.verifiedMagic link utilizzato per autenticarsi

Eventi Gestione Utenti

EventoDescrizione
user.createdNuovo account utente creato (tramite API admin o registrazione)
user.updatedCampi del profilo utente modificati
user.deletedAccount utente soft-deleted
user.enabledUtente precedentemente disabilitato riabilitato
user.disabledAccount utente disabilitato
user.email_verifiedUtente ha verificato il proprio indirizzo email

Eventi Ruoli e Permessi

EventoDescrizione
role.createdNuovo ruolo creato
role.updatedMetadati o permessi del ruolo modificati
role.deletedRuolo eliminato
role.assignedRuolo assegnato a un utente
role.unassignedRuolo rimosso da un utente

Eventi di Sicurezza

EventoDescrizione
mfa.enabledUtente ha abilitato un metodo 2FA (TOTP, SMS o WebAuthn)
mfa.disabledUtente ha disabilitato un metodo 2FA
account.lockedAccount bloccato per rilevamento brute-force
account.unlockedBlocco dell’account rimosso
suspicious_login.detectedRilevata attività di login sospetta (nuovo dispositivo, travel impossibile, ecc.)

Eventi Organizzazione

EventoDescrizione
organization.createdNuova organizzazione creata
organization.updatedMetadati dell’organizzazione modificati
organization.member_addedUtente aggiunto a un’organizzazione
organization.member_removedUtente rimosso da un’organizzazione
organization.invitation_sentEmail di invito inviata

Eventi di Sistema

EventoDescrizione
webhook.testConsegna di test attivata tramite Console o API

Formato Payload Webhook

Ogni consegna webhook invia una richiesta POST con un body JSON:

{ "event": "user.created", "timestamp": "2025-02-18T10:00:00Z", "tenant": "acme-corp", "data": { "userId": "usr_abc123", "email": "[email protected]", "firstName": "Alice", "lastName": "Rossi" } }
CampoTipoDescrizione
eventstringIl tipo di evento (es. user.created)
timestampstringTimestamp ISO 8601 di quando si è verificato l’evento
tenantstringIdentificatore del tenant dove si è verificato l’evento
dataobjectDati payload specifici dell’evento

Verifica della Firma

Ogni consegna include due header per la verifica della firma:

HeaderDescrizione
X-Webhook-SignatureFirma HMAC-SHA256 del body della richiesta
X-Webhook-TimestampTimestamp Unix (secondi) di quando è stata generata la firma

Algoritmo di Verifica

  1. Leggi il body grezzo della richiesta come stringa UTF-8 (non analizzare prima il JSON).
  2. Leggi l’header X-Webhook-Timestamp.
  3. Concatena: timestamp + "." + body
  4. Calcola HMAC-SHA256 della stringa concatenata usando il secret di firma del webhook.
  5. Confronta il risultato codificato in hex con l’header X-Webhook-Signature usando un confronto timing-safe.
  6. Opzionalmente, rifiuta le consegne dove il timestamp è più vecchio di 5 minuti (per prevenire attacchi replay).

Esempio Verifica Node.js

import crypto from 'crypto'; function verifyWebhookSignature(rawBody, signature, timestamp, secret) { // 1. Controlla la freschezza del timestamp (opzionale ma consigliato) const currentTime = Math.floor(Date.now() / 1000); if (Math.abs(currentTime - parseInt(timestamp)) > 300) { throw new Error('Il timestamp del webhook è troppo vecchio'); } // 2. Calcola la firma attesa const signedPayload = `${timestamp}.${rawBody}`; const expectedSignature = crypto .createHmac('sha256', secret) .update(signedPayload) .digest('hex'); // 3. Confronto timing-safe const expected = Buffer.from(expectedSignature, 'hex'); const received = Buffer.from(signature, 'hex'); if (expected.length !== received.length) { return false; } return crypto.timingSafeEqual(expected, received); } // Gestore Express.js app.post('/webhooks/auris', express.raw({ type: 'application/json' }), (req, res) => { const signature = req.headers['x-webhook-signature']; const timestamp = req.headers['x-webhook-timestamp']; const rawBody = req.body.toString('utf-8'); if (!verifyWebhookSignature(rawBody, signature, timestamp, process.env.AURIS_WEBHOOK_SECRET)) { return res.status(401).json({ error: 'Firma non valida' }); } const event = JSON.parse(rawBody); console.log(`Ricevuto ${event.event}:`, event.data); // Elabora l'evento... res.status(200).json({ received: true }); });

Esempio Verifica Python

import hmac import hashlib import time def verify_webhook_signature(raw_body: bytes, signature: str, timestamp: str, secret: str) -> bool: # Controlla la freschezza del timestamp current_time = int(time.time()) if abs(current_time - int(timestamp)) > 300: return False # Calcola la firma attesa signed_payload = f"{timestamp}.{raw_body.decode('utf-8')}" expected = hmac.new( secret.encode('utf-8'), signed_payload.encode('utf-8'), hashlib.sha256 ).hexdigest() # Confronto timing-safe return hmac.compare_digest(expected, signature)

L’SDK @auris/js include un’utilità di verifica webhook integrata: import { verifyWebhookSignature } from '@auris/js'. Gestisce la validazione del timestamp, il calcolo HMAC e il confronto timing-safe. Consulta la documentazione SDK per i dettagli.

Comportamento di Consegna

Timeout

Auris attende fino a 30 secondi per una risposta dal tuo endpoint webhook. Se il tuo endpoint non risponde entro questa finestra, la consegna viene contrassegnata come fallita.

Policy di Retry

Le consegne fallite vengono ritentate con backoff esponenziale:

TentativoRitardo
1° retry1 minuto
2° retry5 minuti
3° retry30 minuti

Dopo 3 tentativi falliti, la consegna viene contrassegnata come definitivamente fallita. Può comunque essere ritentata manualmente tramite API o Console.

Disabilitazione Automatica

Se un webhook accumula 10 errori consecutivi (in qualsiasi consegna), viene automaticamente disattivato (isActive: false). Dovrai correggere l’endpoint e riabilitare manualmente il webhook tramite PATCH /api/webhooks/[id] con { "isActive": true }.

Idempotenza

Il tuo gestore webhook deve essere idempotente. In casi rari (problemi di rete, retry), lo stesso evento potrebbe essere consegnato più di una volta. Usa i campi timestamp e event per la deduplicazione se necessario.

Best Practice

  1. Rispondi rapidamente: Restituisci un codice di stato 2xx il prima possibile. Elabora l’evento in modo asincrono (es. mettilo in coda) piuttosto che fare lavoro pesante nel gestore della richiesta.
  2. Verifica le firme: Verifica sempre la firma HMAC-SHA256 prima di elaborare il payload. Non fidarti mai di un payload webhook senza verifica.
  3. Usa HTTPS: Auris rifiuta gli URL webhook non HTTPS. Usa un certificato TLS valido.
  4. Gestisci i retry: Progetta il tuo gestore in modo idempotente. Lo stesso evento potrebbe essere consegnato più di una volta.
  5. Ruota i secret periodicamente: Usa l’endpoint rotate-secret per generare un nuovo secret di firma con regolare cadenza (es. trimestrale).
  6. Monitora le consegne: Controlla il log di consegna nella Console o tramite API per assicurarti che il tuo endpoint sia sano.

Pagine Correlate