Webhook Almak — Ödeme Tamamlandı Diyen Gerçekten Sağlayıcı mı?
Önce şunu oku: Outbox ve Idempotent Consumer — Olay Kaybolmasın, İki Kez de İşlenmesin
30 saniyede özet
Ödeme sağlayıcısı bir olayı webhook ile haber verir. Adresi bulan herkes de aynı adrese istek atabilir, sağlayıcı da aynı olayı ikinci kez gönderebilir. Önce HMAC imzasını doğrula, sonra olay kimliğine bak.
Bir şirketin resepsiyonunda bir mektup kutusu var. Kutuya herkes mektup atabilir. Bankadan geldiğini mühür kanıtlar; aynı numaralı mektubun ikinci kez gelmesi ise kuryenin yeniden denemesidir, yeni para değil.
-
Bayt: Ödeme sağlayıcısı "ödeme tamamlandı" diye bizim adresimize istek atıyor. Biz de cüzdana ekliyoruz.
-
Sen: Ama bugün cüzdana 7050 TL eklenmiş. Gerçek ödemeler 550 TL tutuyor.
-
Bayt: Adresi bulan biri 1000 TL yazmış, biri de tutarı 50'den 5000'e çevirmiş! Bir ödeme de iki kez gelmiş.
-
Bayt: Önce mühre bakacağız, sonra mektup numarasına.
Kim gönderdi?
Bir webhookBir olay olunca karşı sistemin senin verdiğin adrese kendiliğinden HTTP isteği atması. Sen sormazsın, o haber verir.Sözlükte gör →, karşı sistemin bir olay olunca senin adresine kendiliğinden istek atmasıdır. Ama o adres gizli bir şifre değildir; loglarda, ekran görüntülerinde ya da tahminle ortaya çıkabilir.
Güven, HMAC imzasıGövde ve iki tarafın bildiği gizli bir anahtarla hesaplanan imza. Çağrının kimden geldiğini ve yolda değişmediğini kanıtlar.Sözlükte gör → gelir. Sağlayıcı gövdeyi iki tarafın bildiği gizli bir anahtarla imzalar. Anahtarı bilmeyen doğru imzayı üretemez; gövdede tek bir bayt değişirse imza tutmaz.
Kafam karıştı, daha basit anlat
Adres herkese açık olabilir. Çağrının gerçek olduğunu imza kanıtlar.
Webhook nedir?
Webhook adresini kimsenin bilmemesi yeterli bir güvenlik önlemi midir?
Kaçıncı kez geldi?
İmzayı doğruluyoruz. Sağlayıcı aynı ödemeyi, bizim cevabımız ona geç ulaştığı için ikinci kez gönderdi. İmzası doğru. Cüzdana ne olur? Cevabı göster
Aynı ödeme ikinci kez eklenir. Tekrar gelen çağrı da sağlayıcıdan gelir ve imzası doğrudur. İmza kimin gönderdiğini söyler, kaçıncı kez geldiğini değil.
Adım adım oku
- Kutuya herkes mektup atabilir.
- Mühür tutmuyor: sahte.
- Aynı numara ikinci kez: kurye tekrar denedi.
- Önce mühre bak, sonra numaraya.
Her olayın bir kimliği vardır. İşlenen kimlik kaydedilir; aynı kimlik yeniden gelirse para eklenmez, yalnızca “aldım” denir. Bu, idempotencyAynı işlemin bir kez de on kez de çalışsa aynı sonucu vermesi. Dağıtık sistemde timeout aldığında işlemin yapılıp yapılmadığını bilemediğin için zorunludur.Sözlükte gör →’nin webhook’taki hâlidir.
Sıra önemlidir. İmza doğrulanmadan kimlik kaydedilirse, yolda değiştirilmiş bir çağrı kimliği kapar; gerçeği gelince tekrar sanılıp atlanır.
Kafam karıştı, daha basit anlat
İmza kimin gönderdiğini, kimlik kaçıncı kez geldiğini söyler. Önce imza, sonra kimlik.
HMAC imzası neyi kanıtlar?
Sağlayıcı aynı olayı neden ikinci kez gönderir?
Kendin gör
Ödeme sağlayıcısından gelen çağrılar
Tohum 32024- evt_1 · 500 TL · gerçek
- evt_1 · 500 TL · sağlayıcının tekrarı
- evt_9 · 1000 TL · sahte
- evt_2 · 5000 TL · yolda değiştirilmiş
- evt_2 · 50 TL · gerçek
Cüzdana eklenen: 0 TL · olması gereken: 550 TL · ✕ yanlış: 0
Şu an ne oldu?
Çağrılar geliyor
Doğru toplam 550 TL. Bakalım cüzdana ne eklenecek.
Görevler0/3
Sahte bir çağrı cüzdana para eklesinaçık
İpucu
İmzayı doğrulama.
İmza doğru, ama aynı ödeme iki kez eklensinaçık
İpucu
Yalnızca imza.
Cüzdana tam 550 TL eklensinaçık
İpucu
İkisi birden.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. Hiçbir kontrol yok: sahte, değiştirilmiş ve tekrar eden çağrılar dahil 7050 TL eklendi.
- Yalnızca “imzayı doğrula”yı aç. Sahteler durdu, ama tekrar gelen ödeme ikinci kez eklendi: 1050 TL.
- Yalnızca “kimliği atla”yı aç. Değiştirilmiş çağrı evt_2 kimliğini kaptı; gerçek 50 TL hiç eklenmedi.
- İkisini birden aç. Cüzdana tam 550 TL eklendi.
Aynı olayın iki kez para eklemesini ne önler?
İmza doğrulanmadan olay kimliği "işlendi" diye kaydedilirse ne olabilir?
Tuzaklar
Gövdeyi ayrıştırıp sonra imzalamak. JSON’u nesneye çevirip yeniden yazmak boşlukları ve alan sırasını değiştirir. İmzayı gelen ham baytlarla doğrula.
Eski çağrıyı yeniden oynatmak. Bir hafta önceki gerçek bir çağrının imzası hâlâ geçerlidir. İmzaya dahil zaman damgasını kontrol et ve birkaç dakikadan eskisini reddet.
İşi bitirince cevap vermek. Sağlayıcı cevabı birkaç saniye bekler; geç kalırsan aynı olayı yine gönderir. İmzayı doğrula, olayı kaydet, hemen başarılı dön ve işi arka planda yap.
Kafam karıştı, daha basit anlat
Ham baytları doğrula, eski çağrıyı reddet, hızlıca “aldım” de.
İmza neden gövdenin JSON'a çevrilmiş hâlinden değil, gelen ham baytlardan hesaplanır?
Derinleş · Cüzdan servisi: ödeme sağlayıcısının webhook'u 4 dosya · ~102 satır · ilk okumada atlayabilirsin
Kendini sına
Webhook adresini gizli tutmak, sahte çağrıları durdurmaya yeter.
Sağlayıcı cevabı 10 saniyede bekliyor ama işlem 30 saniye sürüyor. Ne yapılmalı?
Aklında kalacak üç şey
- 1 Webhook adresi gizli bir şifre değildir. Çağrının gerçekten sağlayıcıdan geldiğini ve yolda değişmediğini HMAC imzası kanıtlar.
- 2 Sağlayıcı cevabımızı alamazsa aynı olayı yeniden gönderir. Olay kimliği kaydedilir, daha önce işlenmiş olay atlanır.
- 3 Sıra önemlidir: önce imza, sonra kimlik. Doğrulanmamış bir çağrıya kimlik ayırmak, gerçeğini dışarıda bırakır.
4 kart sonraki derste seni bekliyor