Webhook'lar
Bir şey olduğunda endpoint'lerinizi çağırın.
Webhook, membership'te belirli bir olay gerçekleştiğinde seçtiğiniz bir URL'ye HTTP isteği gönderir. Diğer sistemleri ErtisAuth ile senkron tutmak için webhook'ları kullanın: bir kullanıcı kaydolduğunda bir müşteri kaydı oluşturun, bir kullanıcı silindiğinde verilerini temizleyin, bir rol değiştiğinde bir sohbet kanalına mesaj gönderin.
Webhook nesnesi#
{
"_id": "66f1c0d2a4b5c6d7e8f901a0",
"name": "Sync new users to CRM",
"slug": "sync-new-users-to-crm",
"description": "Creates a contact for every new user",
"event": "UserCreated",
"status": "active",
"try_count": 3,
"request": {
"method": "POST",
"url": "https://crm.example.com/hooks/ertisauth/users/{{document._id}}",
"headers": {
"Authorization": "Bearer <crm_api_key>",
"X-Source": "ertisauth"
},
"body": {
"email": "{{document.email_address}}",
"name": "{{document.firstname}} {{document.lastname}}",
"source": "signup"
},
"uncoveredBody": false
},
"membership_id": "66f1c0d2a4b5c6d7e8f90123"
}| Alan | Zorunlu | Açıklama |
|---|---|---|
name | evet | Görünen ad. |
description | hayır | |
event | evet | Webhook'u tetikleyen olay tipi, ör. UserCreated. |
status | evet | active ya da passive. Pasif webhook'lar saklanır ama çağrılmaz. |
try_count | evet | Başarısız bir isteğin kaç kez deneneceği, 1 ile 5 arası. |
request.method | evet | HTTP metodu: GET, POST, PUT, PATCH, DELETE… |
request.url | evet | Çağrılacak URL. Placeholder içerebilir. |
request.headers | hayır | Gönderilecek header'lar. Değerler placeholder içerebilir. |
request.body | hayır | Bir JSON nesnesi. String değerler placeholder içerebilir. |
request.uncoveredBody | hayır | Bkz. İstek gövdesi. Varsayılan false. |
Placeholder'lar#
URL, header değerleri ve gövdenin string değerleri, olaydan doldurulan çift süslü parantezli placeholder'lar içerebilir:
| Placeholder | Değer |
|---|---|
{{event_type}} | Olay tipi |
{{utilizer_id}} | Olaya kimin yol açtığı |
{{event_time}} | Ne zaman olduğu |
{{membership_id}} | Membership id'si |
{{document.<field>}} | Kaynağın değişiklikten sonraki halinin bir alanı, ör. {{document.email_address}} |
{{prior.<field>}} | Kaynağın değişiklikten önceki halinin bir alanı |
İç içe alanlar nokta kullanır: {{document.sys.created_by}}.
Değerler kullanıldıkları yere göre escape edilir; böylece bir olayın verisi (örneğin bir kullanıcının adı) isteği değiştiremez:
- URL'de değerler URL-encode edilir (
../admin,..%2Fadminolur); - header'larda satır sonu içerecek bir değer gönderilmez;
- gövde'de her placeholder kendi JSON string'inin içinde kalır: alan ekleyemez ya da yapıyı değiştiremez.
İstek gövdesi#
Varsayılan olarak (uncoveredBody: false) istek gövdesi, body'nizi olayın dokümanlarıyla birlikte sarmalar:
{
"document": { "_id": "66f1c0d2a4b5c6d7e8f90127", "username": "ada", "email_address": "ada@example.com", "…": "…" },
"prior": null,
"payload": {
"email": "ada@example.com",
"name": "Ada Lovelace",
"source": "signup"
}
}uncoveredBody: true ile istek gövdesi, placeholder'lar doldurulduktan sonra yalnızca sizin body'nizdir:
{
"email": "ada@example.com",
"name": "Ada Lovelace",
"source": "signup"
}Alıcı API belirli bir biçim bekliyorsa uncoveredBody: true kullanın.
Gönderim#
- Webhook'lar bir arka plan kuyruğundan asenkron olarak çağrılır: olaya yol açan istek onları beklemez ve yavaş ya da hata veren bir alıcı ErtisAuth'u yavaşlatamaz ya da bozamaz.
- Alıcı 2xx durum koduyla yanıt verdiğinde çağrı başarılı sayılır. Aksi halde, toplamda
try_countkadar olmak üzere, art arda yeniden denenir. - Her deneme, ne olduğunu görebilmeniz için istek, durum kodu ve yanıt gövdesiyle bir
WebhookRequestSentya daWebhookRequestFailedolayı kaydeder. - Webhook'lar tam olarak bir kez değil, deneme başına en fazla bir kez gönderilir: alıcınızı idempotent yapın (örneğin
document._idkullanarak) ve çağrı kuyruktayken ErtisAuth yeniden başlarsa kaçırılabileceğini göz önünde bulundurun.
Alıcınızı güvenli hale getirme#
- HTTPS kullanın.
- Çağrıları doğrulayın: bir header'a (
"Authorization": "Bearer <secret>") ya da URL'ye bir secret koyun ve alıcınızda kontrol edin. - Gövdeye körü körüne güvenmeyin: şüphe duyduğunuzda kaynağı bir uygulama token'ıyla ErtisAuth'tan okuyun.
Endpoint'ler#
Tüm route'lar /memberships/{membershipId} altındadır.
| Metot | Route | Açıklama | Yetki |
|---|---|---|---|
GET | /webhooks/{id} | Webhook getirme | webhooks.read.{id} |
GET | /webhooks | Webhook'ları listeleme | webhooks.read |
POST | /webhooks/_query | Webhook'ları sorgulama | webhooks.read |
POST | /webhooks | Webhook oluşturma | webhooks.create |
PUT | /webhooks/{id} | Webhook güncelleme | webhooks.update.{id} |
DELETE | /webhooks/{id} | Webhook silme | webhooks.delete.{id} |
DELETE | /webhooks | Birden fazla webhook silme | webhooks.delete |
Webhook oluşturma#
curl -X POST https://auth.example.com/memberships/<membership_id>/webhooks \
-H 'Authorization: Bearer <access_token>' \
-H 'Content-Type: application/json' \
-d '{
"name": "Notify on user deletion",
"event": "UserDeleted",
"status": "active",
"try_count": 3,
"request": {
"method": "DELETE",
"url": "https://shop.example.com/api/customers/{{prior._id}}",
"headers": { "Authorization": "Bearer <shop_api_key>" }
}
}'Yanıt 201 Created: webhook.
| Hata | Ne zaman |
|---|---|
400 ModelValidationError | Zorunlu bir alan eksik, olay tipi ya da HTTP metodu bilinmiyor veya try_count 1 ile 5 arasında değil |
404 MembershipNotFound | Membership yok |
409 WebhookAlreadyExists | Slug kullanımda |
Güncelleme ve silme#
PUT /webhooks/{id} webhook'u gövdeyle (oluşturmayla aynı alanlar) tamamen değiştirir. Hiçbir değişiklik içermeyen bir güncelleme 409 IdenticalDocumentError döner. DELETE /webhooks/{id} 204 No Content döner.
Olaylar#
WebhookCreated, WebhookUpdated, WebhookDeleted ve gönderim olayları WebhookRequestSent ile WebhookRequestFailed. Bkz. Olaylar.
Dokümantasyonda bir hata mı buldunuz? Issue açın