Aller au contenu

Webhooks

Les webhooks envoient chaque entrée du journal d’audit des actions admin à une URL que vous contrôlez, dès qu’elle est enregistrée : utilisateur créé, supprimé ou bloqué, rôles modifiés, import, suppression en attente d’approbation, etc.

Gérez-les dans Paramètres > Intégrations > Webhooks. Cette page est réservée aux administrateurs de l’instance et aux propriétaires d’organisation. Un webhook appartient à l’organisation où il a été créé.

Indiquez l’URL, éventuellement une description, et choisissez Tous les événements ou certains. Le secret de signature n’est affiché qu’une fois, à l’ajout : copiez-le à ce moment. Envoyer un test envoie un événement webhook.test et montre le résultat. Vous pouvez désactiver ou supprimer un webhook à tout moment. 10 au plus par organisation.

L’URL doit utiliser https et ne pas contenir d’identifiants. Par défaut, AUMS refuse d’envoyer vers des adresses privées, de bouclage ou de lien local (revérifiées à la connexion, pour qu’un hôte ne puisse pas changer de réponse entre-temps) et ne suit jamais les redirections.

Un POST avec un corps JSON :

{
"id": "0d4f…",
"type": "user.delete",
"created_at": "2026-10-02T10:00:00.000Z",
"organization_id": "org_…",
"status": "success",
"actor": { "id": "usr_…", "email": "admin@example.com" },
"target": { "type": "user", "id": "auth0|123" },
"details": { "reason": "départ de l'entreprise" }
}

type est l’action d’audit (user.create, user.delete, user.roles.update… ; le filtre des journaux d’audit les liste), status vaut success ou failure. L’adresse IP et le user agent de l’administrateur ne sont pas envoyés.

En-têtes : X-AUMS-Event, X-AUMS-Delivery (unique par envoi), X-AUMS-Timestamp (secondes Unix) et X-AUMS-Signature.

La signature est v1= suivi du HMAC-SHA256 hexadécimal, avec votre secret de signature comme clé, de <timestamp>.<corps brut>. Recalculez-la sur le corps brut, comparez en temps constant et rejetez les horodatages anciens pour empêcher le rejeu.

import { createHmac, timingSafeEqual } from 'node:crypto'
function verify(secret, headers, rawBody) {
const expected = `v1=${createHmac('sha256', secret)
.update(`${headers['x-aums-timestamp']}.${rawBody}`)
.digest('hex')}`
const given = Buffer.from(headers['x-aums-signature'] ?? '')
return (
given.length === expected.length &&
timingSafeEqual(given, Buffer.from(expected))
)
}

Toute réponse 2xx vaut pour livrée. Sinon (ou après 10 secondes sans réponse), AUMS réessaie après 1 minute, 5 minutes, 30 minutes, 2 heures et 12 heures, puis abandonne au bout de 6 tentatives. Les nouvelles tentatives partent d’une tâche planifiée chaque minute (un déclencheur cron sur Cloudflare). Un envoi peut arriver plusieurs fois : utilisez X-AUMS-Delivery pour ignorer les doublons. Les envois sont gardés 30 jours ; la page de paramètres montre les plus récents.