Přejít na dokumentaci
SDK

Ověření doručení

`verifyWebhookSignature`: porovnání v konstantním čase, okno proti přehrání a naparsovaná událost zpět.

V handleru požadavku

URL webhooku je veřejná. Kdokoli na internetu na ni může poslat POST se správně tvarovaným JSON, takže handler, který čte payload.type bez ověření podpisu, je otevřené zapisovací 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 })}

Předávejte NEZPRACOVANÉ tělo požadavku. Naparsování a opětovná serializace změní pořadí klíčů i mezery a podpis pak nebude sedět. headers přijímá objekt Headers nebo obyčejný objekt, například req.headers z Node, a hlavička X-OpenEmail-Signature se najde bez ohledu na velikost písmen.

Dvě věci, které tohle ošetří a ručně psaná kontrola obvykle ne: porovnává MAC v konstantním čase, takže správnou předponu nelze odhalit měřením času, a odmítne doručení starší než toleranceSeconds na kteroukoli stranu — bez jiného nastavení pět minut — takže zachycený požadavek nelze přehrávat donekonečna. toleranceSeconds: 0 kontrolu přehrání vypne. Obě chyby jsou tiché. Handler s kteroukoli z nich projde každým testem, který vás napadne napsat.

Při každém selhání vyhodí výjimku: chybějící hlavička X-OpenEmail-Signature, hlavička, která nemá tvar t=<seconds>,v1=<hex>, časové razítko mimo okno nebo nesouhlasící podpis. Při úspěchu se resolvuje na tělo naparsované jako WebhookPayload, takže tu není žádné druhé JSON.parse, které by se dalo pokazit. Typ pro data určíte předáním typového argumentu, například EmailOpenedData.

Vyžaduje globalThis.crypto.subtle, které poskytují Node 20+, Bun, Deno i Cloudflare Workers.