
# keenauth_webhook_endpoint

`keenauth_webhook_endpoint` kaynağı bir web kancası ucunu yönetir: ortamın olaylarını Standard Webhooks ile imzalanmış olarak alan bir HTTPS adresi. Sağlayıcı imza sırrını durum dosyasında yalnız sizin verdiğiniz RSA ortak anahtarıyla şifrelenmiş tutar.

```terraform
resource "keenauth_webhook_endpoint" "orders" {
  key         = "orders"
  url         = "https://hooks.example.com/keenauth"
  description = "Order service"
  event_types = ["user.created", "user.updated", "organization.created"]
  event_schema_versions = {
    "user.created" = 1
  }
  public_key = file("${path.module}/webhook-secret-key.pub.pem")

  rotation_trigger          = time_rotating.webhook_secret.id
  previous_secret_ttl_hours = 48
}

resource "time_rotating" "webhook_secret" {
  rotation_days = 90
}

output "orders_webhook_secret_encrypted" {
  value = keenauth_webhook_endpoint.orders.encrypted_signing_secret
}
```

## Bağımsız değişkenler

- `url` zorunludur: yalnız `https`, port yok ya da 443, kullanıcı bilgisi ve parça yok, IP adresi yerine ana makine adı (en çok 2048 karakter).
- `key` ortamda tekildir (`^[a-z0-9][a-z0-9_-]{0,63}$`). Yazmazsanız API `endpoint-<kimliğin son 8 karakteri>` değerini üretir.
- `event_types` katalogdaki olay türlerini listeler (en çok 100). Varsayılan boş küme, yüksek hacimli `authentication.*` türleri dışındaki bütün türler demektir; onları adıyla yazmanız gerekir.
- `event_schema_versions` bir olay türünü yük şeması sürümüne eşler. Her tür, ucun aldığı türlerden biri olmalıdır.
- `payload_mode` `thin` (varsayılan: kimlikler, değişen alan adları ve durum alanları, kişisel veri yok) ya da `full` olur.
- `rate_limit_per_second` 1 ile 1000 arasıdır; varsayılan 50.
- `status` `enabled` (varsayılan) ya da `disabled_by_user` olur.

Her bağımsız değişken yerinde değişir. Güncelleme yalnız değişen alanları JSON Merge Patch olarak, son okumanın ETag'ini `If-Match` başlığında göndererek yapar. Uç son okumadan sonra başka bir yerden değiştirildiyse apply `412` ile başarısız olur ve hiçbir şey değişmez; sapmayı görmek için planı yeniden çalıştırın.

## İmza sırrı hiçbir zaman düz metin saklanmaz

API imza sırrını (`idp_whsec_…`) yalnız uç oluşturulurken ve sır döndürülürken verir. `public_key` verilmişse sağlayıcı sırrı RSA-OAEP (SHA-256, MGF1 SHA-256, boş etiket) ile şifreler ve `encrypted_signing_secret` alanına yalnız base64 şifreli metni yazar. `public_key` yoksa sır atılır; sonradan `keenauth webhook-endpoints rotate-secret` ile döndürün ya da `public_key` ekleyin. Düz sır durum dosyasına, plan dosyasına, çıktıya ya da loga hiçbir zaman girmez.

Anahtar çiftini bir kez, OpenTofu dışında oluşturun ve özel anahtarı yapılandırmanızın dışında tutun:

```shell
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out webhook-secret-key.pem
openssl pkey -in webhook-secret-key.pem -pubout -out webhook-secret-key.pub.pem
```

`tofu apply` sonrasında sırrı çözüp alıcıya verin:

```shell
tofu output -raw orders_webhook_secret_encrypted | base64 -d | \
  openssl pkeyutl -decrypt -inkey webhook-secret-key.pem \
    -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 -pkeyopt rsa_mgf1_md:sha256
```

`public_key` en az 2048 bitlik, PEM kodlu bir RSA ortak anahtarı (`PUBLIC KEY` ya da `RSA PUBLIC KEY`) olmalıdır. Özel anahtar ya da daha küçük bir anahtar plan aşamasında reddedilir.

## Döndürme

`public_key` eklendiğinde ya da değiştiğinde ve `rotation_trigger` yeni bir değere geçtiğinde (örneğin bir `time_rotating` kaynağının kimliği) sır döndürülür. Döndürmeden sonra eski sır `previous_secret_ttl_hours` boyunca yenisinin yanında imzalamayı sürdürür (0 ile 168 arası; API varsayılanı 24; 0 eskisini hemen düşürür), böylece alıcı olay kaçırmadan geçiş yapar. `previous_secret_expires_at` eski sırrın ne zaman duracağını gösterir. `public_key`'i kaldırmak yalnız `encrypted_signing_secret`'i kaldırır; sırrı döndürmez.

## Sınırlar ve durum

Etkin bir uç planın ortam başına sınırına sayılır: Free 3, Startup 20, Business 20, Enterprise 50. Bir uç daha oluşturmak ya da etkinleştirmek `403 quota_exceeded` ile başarısız olur; başka bir ucu kapatın ya da silin veya planı yükseltin.

KeenAuth sürekli başarısız olan (`disabled_by_failure`) ya da alıcısı `410 Gone` dönen (`disabled_by_receiver`) bir ucu kapatır. Sonraki plan yapılandırılmış `status` değerine dönüşü gösterir; uygulamak ucu yeniden etkinleştirir.

## İçe aktarma

Uç kimliği ya da anahtarıyla içe aktarın:

```shell
tofu import keenauth_webhook_endpoint.orders orders
```

İmza sırrı geri okunamaz; bu yüzden içe aktarmadan sonra `encrypted_signing_secret` boştur. Yapılandırmanızda `public_key` varsa sonraki apply sırrı döndürür ve yenisini şifreli teslim eder.

Test gönderimi, yeniden oynatma ve teslim yeniden denemesi yapılandırma değil, tek seferlik eylemlerdir. Bunlar için `keenauth webhook-endpoints test`, `replay` ve `deliveries` komutlarını kullanın.
