Paystack Webhook İmzalarını Express'te Doğrula – webdedik gönderisi

Paystack Webhook İmzalarını Express'te Doğrula

Webhook'ları almak kolay, ama hangisine güveneceksin? Paystack gibi ödeme servisleri webhook gönderiyor, fakat araya giren biri sahte bir istek atabilir. İmza doğrulaması bu riski ortadan kaldırıyor.

Paystack her webhook'la bir imza (signature) gönderir. Bu imza, Paystack'ın gizli anahtarı ve webhook verisinin birleşiminden oluşturulur. Sen de aynı yöntemi kullanarak imzayı yeniden hesapla ve gelen imzayla karşılaştır. Eşleşirse, istek gerçekten Paystack'tan gelmiştir.

Express'te bunu yapmak basit. Webhook'u alan route'unda, gelen body'yi ham string olarak al (JSON parse etmeden önce), SHA512 hash algoritmasıyla Paystack secret key'inle birlikte hash'le. Sonra gelen `x-paystack-signature` header'ıyla karşılaştır.

1const crypto = require('crypto');
2const express = require('express');
3const app = express();
4
5const PAYSTACK_SECRET = process.env.PAYSTACK_SECRET;
6
7app.post('/webhook', express.raw({type: 'application/json'}), (req, res) => {
8const signature = req.headers['x-paystack-signature'];
9const hash = crypto.createHmac('sha512', PAYSTACK_SECRET).update(req.body).digest('hex');
10
11if (hash === signature) {
12console.log('İmza doğru, webhook güvenli');
13// Webhook verisini işle
14res.status(200).send('OK');
15} else {
16console.log('İmza uyuşmadı, sahte istek!');
17res.status(403).send('Unauthorized');
18}
19});
20
21app.listen(3000);

Burada kritik nokta `express.raw()` middleware'i. Eğer normal `express.json()` kullanırsan, body otomatik parse edilir ve orijinal string kaybedilir, hash'i yeniden hesaplayamazsın. Raw body gerekli.

Environment değişkeninde PAYSTACK_SECRET'i sakla, asla hardcode etme. Webhook test ederken Paystack dashboard'dan test signature'ı kopyalayıp local'de deneyebilirsin.

Bu basit kontrol, ödeme sisteminde güvenlik açığı bırakmaz. FredAbod'un yazısında daha detaylı örnekler ve TypeScript versiyonu bulabilirsin.

konu hakkında tepkinizi verebilirsiniz