Belgelere geç
SDK

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.

webhook-handler.ts
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.