Webhooks einrichten
Webhooks ermöglichen es deiner Anwendung, Echtzeit-HTTP-Benachrichtigungen zu empfangen, wenn Ereignisse in Auris auftreten, wie z. B. eine Benutzerregistrierung, ein fehlgeschlagener Login, eine zugewiesene Rolle oder eine erstellte Organisation. Anstatt die API nach Änderungen abzufragen, pusht Auris Event-Payloads an deinen Endpunkt, sobald etwas passiert.
Dieser Leitfaden führt dich durch das Erstellen eines Webhook-Empfängers, die Registrierung in der Auris-Console, die Verifizierung von Signaturen für die Sicherheit und die Behandlung von Fehlern.
Warum Webhooks
Ohne Webhooks müsste deine Anwendung regelmäßig Auris-APIs abfragen, um Änderungen zu erkennen. Dies ist ineffizient, führt zu Latenz und verschwendet auf beiden Seiten Ressourcen. Webhooks kehren das um: Auris informiert deine Anwendung sofort, wenn etwas passiert.
Häufige Anwendungsfälle:
- Benutzerdaten synchronisieren in deiner Datenbank, wenn ein Benutzer erstellt oder aktualisiert wird
- Onboarding-Workflows auslösen, wenn sich ein neuer Benutzer registriert
- Zugriff widerrufen in deinem System, wenn ein Benutzer deaktiviert oder gelöscht wird
- Audit-Logging durch Streaming von Ereignissen an dein SIEM
- Slack/Teams-Benachrichtigungen, wenn verdächtige Login-Aktivitäten erkannt werden
Schritt 1: Webhook-Endpunkt in deiner Anwendung erstellen
Dein Webhook-Endpunkt ist ein Standard-HTTP-POST-Handler, der JSON-Payloads von Auris empfängt. Hier ist ein vollständiges Express.js-Beispiel mit Signaturverifizierung:
import express from 'express'
import crypto from 'crypto'
const app = express()
// WICHTIG: Rohen Body für Signaturverifizierung verwenden
app.post(
'/webhooks/auris',
express.raw({ type: 'application/json' }),
(req, res) => {
const signature = req.headers['x-webhook-signature'] as string
const timestamp = req.headers['x-webhook-timestamp'] as string
const secret = process.env.AURIS_WEBHOOK_SECRET! // z.B. whsec_abc123...
// 1. Signatur verifizieren
if (!verifyWebhookSignature(req.body, signature, timestamp, secret)) {
console.error('Webhook-Signaturverifizierung fehlgeschlagen')
return res.status(401).json({ error: 'Ungültige Signatur' })
}
// 2. Ereignis parsen
const event = JSON.parse(req.body.toString())
// 3. Sofort 200 antworten — asynchron verarbeiten
res.status(200).json({ received: true })
// 4. Ereignis asynchron verarbeiten
handleWebhookEvent(event).catch((err) =>
console.error('Webhook-Handler-Fehler:', err)
)
}
)
function verifyWebhookSignature(
body: Buffer,
signature: string,
timestamp: string,
secret: string
): boolean {
// Ablehnen, wenn Zeitstempel älter als 5 Minuten (Replay-Schutz)
const eventTime = parseInt(timestamp, 10)
const now = Math.floor(Date.now() / 1000)
if (Math.abs(now - eventTime) > 300) {
return false
}
// Erwartete Signatur berechnen: HMAC-SHA256(timestamp.body)
const payload = `${timestamp}.${body.toString()}`
const expected = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex')
// Zeitkonstanter Vergleich zum Verhindern von Timing-Angriffen
try {
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
)
} catch {
return false
}
}
async function handleWebhookEvent(event: {
type: string
data: Record<string, unknown>
}) {
switch (event.type) {
case 'user.created':
await syncUser(event.data)
break
case 'user.deleted':
await removeUser(event.data)
break
case 'login.suspicious':
await notifySecurityTeam(event.data)
break
default:
console.log(`Unbehandelter Ereignistyp: ${event.type}`)
}
}Verwende immer den rohen Anfrage-Body (nicht das geparste JSON-Objekt) bei der Berechnung der HMAC-Signatur. Das Parsen und erneute Serialisieren von JSON kann Leerzeichen oder Schlüsselreihenfolge ändern, was die Signatur invalidiert.
Schritt 2: Webhook in der Auris-Console registrieren
- Öffne die Auris-Console und navigiere zu Einstellungen → Webhooks
- Klicke auf Webhook erstellen
- Gib deine Endpunkt-URL ein (z. B.
https://api.ihreapp.com/webhooks/auris) - Wähle die Ereignisse aus, die du empfangen möchtest (oder wähle “Alle Ereignisse”)
- Klicke auf Erstellen
Auris generiert ein Signierungsgeheimnis mit dem Präfix whsec_. Kopiere diesen Wert sofort und speichere ihn sicher in deinen Umgebungsvariablen. Das vollständige Geheimnis wird nur einmal angezeigt.
Schritt 3: Webhook-Signaturen verifizieren
Jede Webhook-Zustellung von Auris enthält zwei Headers zur Verifizierung:
| Header | Beschreibung |
|---|---|
X-Webhook-Signature | HMAC-SHA256-Hex-Digest des Payloads |
X-Webhook-Timestamp | Unix-Zeitstempel (Sekunden) des Ereigniszeitpunkts |
Die Signatur wird berechnet als:
HMAC-SHA256(whsec_secret, "${timestamp}.${rawBody}")Verifizierungsalgorithmus
- Extrahiere die
X-Webhook-Signature- undX-Webhook-Timestamp-Header - Prüfe, ob der Zeitstempel innerhalb von 5 Minuten der aktuellen Zeit liegt (Replay-Schutz)
- Konkateniere den Zeitstempel, einen wörtlichen Punkt (
.) und den rohen Anfrage-Body - Berechne den HMAC-SHA256 dieses Strings mit deinem
whsec_-Signierungsgeheimnis - Vergleiche deine berechnete Signatur mit der empfangenen Signatur mit einem zeitkonstanten Vergleich
import crypto from 'crypto'
export function verifyAurisWebhook(
rawBody: string | Buffer,
signature: string,
timestamp: string,
secret: string
): boolean {
const ts = parseInt(timestamp, 10)
if (isNaN(ts) || Math.abs(Date.now() / 1000 - ts) > 300) {
return false
}
const body = typeof rawBody === 'string' ? rawBody : rawBody.toString('utf-8')
const payload = `${timestamp}.${body}`
const expected = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex')
try {
return crypto.timingSafeEqual(
Buffer.from(signature, 'utf-8'),
Buffer.from(expected, 'utf-8')
)
} catch {
return false
}
}Überspringe niemals die Signaturverifizierung in der Produktion. Ohne sie kann jeder Angreifer, der deine Endpunkt-URL entdeckt, gefälschte Ereignisse an deine Anwendung senden.
Ereigniskatalog
Auris sendet Ereignisse in folgenden Kategorien:
Benutzer-Ereignisse
| Ereignis | Ausgelöst wenn |
|---|---|
user.created | Ein neuer Benutzer registriert sich (Signup, Admin-Erstellung, SCIM-Provisionierung oder SSO JIT) |
user.updated | Benutzerprofilfelder werden geändert |
user.deleted | Ein Benutzer wird soft-gelöscht |
user.email_verified | Ein Benutzer verifiziert seine E-Mail-Adresse |
user.password_changed | Ein Benutzer ändert sein Passwort |
user.blocked | Ein Benutzerkonto wird deaktiviert |
user.unblocked | Ein Benutzerkonto wird wieder aktiviert |
Login-Ereignisse
| Ereignis | Ausgelöst wenn |
|---|---|
login.succeeded | Ein Benutzer authentifiziert sich erfolgreich |
login.failed | Ein Login-Versuch schlägt fehl |
login.mfa_required | MFA Step-Up wird während des Logins ausgelöst |
login.suspicious | Ein Login wird von der Suspicious-Login-Erkennung markiert |
Rollen- und Berechtigungsereignisse
| Ereignis | Ausgelöst wenn |
|---|---|
role.created | Eine neue Rolle wird erstellt |
role.updated | Name, Beschreibung oder Berechtigungen einer Rolle werden geändert |
role.deleted | Eine Rolle wird gelöscht |
role.assigned | Eine Rolle wird einem Benutzer zugewiesen |
role.unassigned | Eine Rolle wird von einem Benutzer entfernt |
Organisations-Ereignisse
| Ereignis | Ausgelöst wenn |
|---|---|
organization.created | Eine neue Organisation wird erstellt |
organization.updated | Organisationsdetails werden geändert |
organization.deleted | Eine Organisation wird gelöscht |
organization.member_added | Ein Benutzer tritt einer Organisation bei |
organization.member_removed | Ein Benutzer wird aus einer Organisation entfernt |
organization.invitation_sent | Eine Einladung wird gesendet |
organization.invitation_accepted | Eine Einladung wird angenommen |
Beispiel-Payload
{
"id": "evt_abc123def456",
"type": "user.created",
"timestamp": "2026-01-15T10:30:00Z",
"data": {
"id": "usr_xyz789",
"email": "[email protected]",
"firstName": "Jane",
"lastName": "Doe",
"emailVerified": false,
"roles": [],
"createdAt": "2026-01-15T10:30:00Z"
}
}Fehler und Wiederholungsversuche behandeln
Wenn dein Endpunkt einen Nicht-2xx-Statuscode zurückgibt oder nicht innerhalb von 30 Sekunden antwortet, betrachtet Auris die Zustellung als fehlgeschlagen und wiederholt mit exponentiellem Backoff:
| Versuch | Verzögerung nach Fehler |
|---|---|
| 1. Wiederholung | 1 Minute |
| 2. Wiederholung | 5 Minuten |
| 3. Wiederholung | 30 Minuten |
| 4. Wiederholung | 2 Stunden |
| 5. Wiederholung | 12 Stunden |
Wenn ein Webhook-Endpunkt konstant fehlschlägt, deaktiviert Auris den Webhook nach 10 aufeinanderfolgenden fehlgeschlagenen Zustellungen automatisch und sendet eine Benachrichtigung an Tenant-Administratoren.
Webhooks testen
Console-Test-Schaltfläche
In der Auris-Console hat jeder Webhook eine Test-Schaltfläche, die ein synthetisches Ereignis an deinen Endpunkt sendet.
Lokale Entwicklung mit ngrok
Während der Entwicklung ist dein lokaler Server nicht öffentlich erreichbar. Verwende ein Tunneling-Tool wie ngrok:
# Lokalen Webhook-Server starten
node server.js
# In einem anderen Terminal ngrok starten
ngrok http 3000ngrok stellt eine öffentliche URL bereit wie https://a1b2c3d4.ngrok-free.app. Verwende diese URL bei der Registrierung des Webhooks in der Console.
Best Practices
Sofort mit 200 antworten. Dein Endpunkt sollte HTTP 200 so schnell wie möglich zurückgeben, dann das Ereignis asynchron verarbeiten (z. B. durch Einreihen in eine Warteschlange).
Idempotenz implementieren. Jedes Ereignis enthält ein eindeutiges id-Feld. Speichere verarbeitete Ereignis-IDs und überspringe Duplikate:
async function handleWebhookEvent(event: { id: string; type: string; data: unknown }) {
const exists = await db.processedWebhookEvent.findUnique({
where: { eventId: event.id },
})
if (exists) {
console.log(`Doppeltes Ereignis übersprungen: ${event.id}`)
return
}
await processEvent(event)
await db.processedWebhookEvent.create({
data: { eventId: event.id, processedAt: new Date() },
})
}HTTPS-Endpunkte verwenden. Auris sendet Webhook-Payloads nur über HTTPS. HTTP-Endpunkte werden bei der Registrierung abgelehnt.
Geheimnisse regelmäßig rotieren. Verwende die Console oder API, um dein Webhook-Signierungsgeheimnis zu rotieren.
Verwandte Leitfäden
- Log Streaming — Audit-Logs an externe Dienste wie Datadog und Splunk streamen
- Actions-Engine — Benutzerdefinierte Logik während Authentifizierungsflows ausführen
- Angriffsschutz — Sicherheitspipeline und Suspicious-Login-Erkennung