Ugrás a dokumentációra
SDK

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.

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 })}

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.