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
/api/webhooksRequires: manage:webhooksElenca 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
/api/webhooksRequires: manage:webhooksCrea 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"]
}| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
name | string | Sì | Nome leggibile per questo webhook |
url | string | Sì | URL endpoint HTTPS che riceverà richieste POST |
events | string[] | 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
| Codice | HTTP | Descrizione |
|---|---|---|
VALIDATION_ERROR | 400 | Campi obbligatori mancanti o tipi di evento non validi |
INVALID_URL | 400 | L’URL non è un endpoint HTTPS valido |
INVALID_EVENTS | 400 | Uno o più tipi di evento non sono riconosciuti |
Aggiorna Webhook
/api/webhooks/[id]Requires: manage:webhooksAggiorna 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
/api/webhooks/[id]Requires: manage:webhooksElimina 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
/api/webhooks/[id]/rotate-secretRequires: manage:webhooksGenera 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
/api/webhooks/[id]/testRequires: manage:webhooksInvia 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
/api/webhooks/[id]/deliveriesRequires: manage:webhooksElenca 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
/api/webhooks/[id]/deliveries/[deliveryId]/retryRequires: manage:webhooksRiprova 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
| Evento | Descrizione |
|---|---|
login.success | Utente autenticato con successo (qualsiasi metodo) |
login.failed | Tentativo di autenticazione fallito (credenziali errate, account bloccato, ecc.) |
signup.completed | Nuovo account utente registrato |
logout.completed | Utente disconnesso (sessione invalidata) |
token.refreshed | Access token aggiornato |
password.changed | Utente ha cambiato la propria password |
password.reset_requested | Email di reset password inviata |
magic_link.sent | Email con magic link inviata |
magic_link.verified | Magic link utilizzato per autenticarsi |
Eventi Gestione Utenti
| Evento | Descrizione |
|---|---|
user.created | Nuovo account utente creato (tramite API admin o registrazione) |
user.updated | Campi del profilo utente modificati |
user.deleted | Account utente soft-deleted |
user.enabled | Utente precedentemente disabilitato riabilitato |
user.disabled | Account utente disabilitato |
user.email_verified | Utente ha verificato il proprio indirizzo email |
Eventi Ruoli e Permessi
| Evento | Descrizione |
|---|---|
role.created | Nuovo ruolo creato |
role.updated | Metadati o permessi del ruolo modificati |
role.deleted | Ruolo eliminato |
role.assigned | Ruolo assegnato a un utente |
role.unassigned | Ruolo rimosso da un utente |
Eventi di Sicurezza
| Evento | Descrizione |
|---|---|
mfa.enabled | Utente ha abilitato un metodo 2FA (TOTP, SMS o WebAuthn) |
mfa.disabled | Utente ha disabilitato un metodo 2FA |
account.locked | Account bloccato per rilevamento brute-force |
account.unlocked | Blocco dell’account rimosso |
suspicious_login.detected | Rilevata attività di login sospetta (nuovo dispositivo, travel impossibile, ecc.) |
Eventi Organizzazione
| Evento | Descrizione |
|---|---|
organization.created | Nuova organizzazione creata |
organization.updated | Metadati dell’organizzazione modificati |
organization.member_added | Utente aggiunto a un’organizzazione |
organization.member_removed | Utente rimosso da un’organizzazione |
organization.invitation_sent | Email di invito inviata |
Eventi di Sistema
| Evento | Descrizione |
|---|---|
webhook.test | Consegna 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"
}
}| Campo | Tipo | Descrizione |
|---|---|---|
event | string | Il tipo di evento (es. user.created) |
timestamp | string | Timestamp ISO 8601 di quando si è verificato l’evento |
tenant | string | Identificatore del tenant dove si è verificato l’evento |
data | object | Dati payload specifici dell’evento |
Verifica della Firma
Ogni consegna include due header per la verifica della firma:
| Header | Descrizione |
|---|---|
X-Webhook-Signature | Firma HMAC-SHA256 del body della richiesta |
X-Webhook-Timestamp | Timestamp Unix (secondi) di quando è stata generata la firma |
Algoritmo di Verifica
- Leggi il body grezzo della richiesta come stringa UTF-8 (non analizzare prima il JSON).
- Leggi l’header
X-Webhook-Timestamp. - Concatena:
timestamp + "." + body - Calcola HMAC-SHA256 della stringa concatenata usando il secret di firma del webhook.
- Confronta il risultato codificato in hex con l’header
X-Webhook-Signatureusando un confronto timing-safe. - 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:
| Tentativo | Ritardo |
|---|---|
| 1° retry | 1 minuto |
| 2° retry | 5 minuti |
| 3° retry | 30 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
- Rispondi rapidamente: Restituisci un codice di stato
2xxil prima possibile. Elabora l’evento in modo asincrono (es. mettilo in coda) piuttosto che fare lavoro pesante nel gestore della richiesta. - Verifica le firme: Verifica sempre la firma HMAC-SHA256 prima di elaborare il payload. Non fidarti mai di un payload webhook senza verifica.
- Usa HTTPS: Auris rifiuta gli URL webhook non HTTPS. Usa un certificato TLS valido.
- Gestisci i retry: Progetta il tuo gestore in modo idempotente. Lo stesso evento potrebbe essere consegnato più di una volta.
- Ruota i secret periodicamente: Usa l’endpoint rotate-secret per generare un nuovo secret di firma con regolare cadenza (es. trimestrale).
- Monitora le consegne: Controlla il log di consegna nella Console o tramite API per assicurarti che il tuo endpoint sia sano.
Pagine Correlate
- Configurazione Webhook — Guida passo-passo alla creazione di ricevitori webhook
- Gestione Webhook — Configura i webhook dalla Console
- API Actions Engine — Hook di logica personalizzata che complementa i webhook
- SDK JavaScript —
verifyWebhookSignature()per la verifica delle firme