Kézbesítés ellenőrzése
`verifyWebhookSignature`: konstans idejű, visszajátszási ablakkal, és visszaadja a feldolgozott eseményt.
Kéréskezelőben
A webhook URL nyilvános. Az interneten bárki POST-olhat rá megfelelő alakú JSON-t, így az a kezelő, amely az aláírás ellenőrzése nélkül olvassa a payload.type mezőt, nyitott írási API.
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 })}A NYERS törzset add át. Az elemzés és újraszerializálás megváltoztatja a kulcsok sorrendjét és a szóközöket, így az aláírás nem fog egyezni. A headers egy Headers objektumot vagy egy egyszerű objektumot vár, például a Node req.headers mezőjét, az X-OpenEmail-Signature fejlécet pedig a kis- és nagybetűktől függetlenül megtalálja.
Két dolog, amit ez kezel, és amit egy kézzel írt ellenőrzés általában nem: a MAC-et konstans időben hasonlítja össze, így a helyes előtagot nem lehet időméréssel visszafejteni, és elutasítja azt a kézbesítést, amely bármelyik irányban toleranceSeconds-nál régebbi – ez öt perc, hacsak mást nem mondasz –, így egy elkapott kérés nem játszható vissza örökké. A toleranceSeconds: 0 kikapcsolja a visszajátszás-ellenőrzést. Mindkét hiba néma. Az a kezelő, amelyben bármelyik benne van, minden olyan teszten átmegy, amelynek a megírása eszedbe jutna.
Minden hibánál dob: hiányzó X-OpenEmail-Signature fejléc, nem t=<seconds>,v1=<hex> alakú fejléc, az ablakon kívüli időbélyeg vagy nem egyező aláírás esetén. Sikernél a WebhookPayload típusként elemzett törzzsel tér vissza, így nincs második JSON.parse, amit el lehetne rontani. Adj át típusargumentumot, például EmailOpenedData, a data tipizálásához.
Szüksége van a globalThis.crypto.subtle objektumra, amelyet a Node 20+, a Bun, a Deno és a Cloudflare Workers is biztosít.