Bir teslimatı doğrulamak
`verifyWebhookSignature`: sabit zamanlı, bir yeniden oynatma penceresiyle ve ayrıştırılmış olayı geri vererek.
Bir istek işleyicisinde
Bir webhook URL'si herkese açıktır. İnternetteki herhangi bir şey ona doğru biçimde JSON POST edebilir; bu yüzden imzayı denetlemeden payload.type okuyan bir işleyici, açık bir yazma API'sidir.
import { verifyWebhookSignature } from '@openemail/sdk' export async function POST(request: Request) { try { const event = await verifyWebhookSignature({ payload: await request.text(), headers: request.headers, secret: process.env.OPENEMAIL_WEBHOOK_SECRET!, toleranceSeconds: 300, }) console.log(event.type, event.data) } catch { return new Response('bad signature', { status: 400 }) } return new Response(null, { status: 204 })}HAM gövdeyi iletin. Ayrıştırıp yeniden seri hâle getirmek anahtar sırasını ve boşlukları değiştirir, imza da tutmaz. headers bir Headers nesnesi ya da Node'un req.headers'ı gibi düz bir nesne alır ve X-OpenEmail-Signature, harf durumu ne olursa olsun bulunur.
Elle yazılmış bir denetimin genellikle ele almadığı iki şey: MAC'i sabit zamanda karşılaştırır, böylece doğru ön ek zamanlama ölçülerek geri elde edilemez; ve her iki yönde de toleranceSeconds'tan, yani siz aksini söylemedikçe beş dakikadan, daha eski bir teslimatı reddeder, böylece yakalanmış bir istek sonsuza dek yeniden oynatılamaz. toleranceSeconds: 0 yeniden oynatma denetimini kapatır. Bu hataların ikisi de sessizdir. Hangisini barındırırsa barındırsın bir işleyici, yazmayı akıl edeceğiniz her testi geçer.
Her başarısızlıkta hata fırlatır: eksik bir X-OpenEmail-Signature başlığı, t=<seconds>,v1=<hex> biçiminde olmayan bir başlık, pencerenin dışındaki bir zaman damgası ya da eşleşmeyen bir imza. Başarı durumunda, gövdeyi WebhookPayload olarak ayrıştırılmış hâliyle çözer; böylece yanlış yapılacak ikinci bir JSON.parse kalmaz. data'yı türlemek için EmailOpenedData gibi bir tür argümanı iletin.
globalThis.crypto.subtle'a ihtiyaç duyar; bunu Node 20+, Bun, Deno ve Cloudflare Workers'ın hepsi sağlar.