Pāriet uz dokumentāciju
SDK

Piegādes pārbaude

`verifyWebhookSignature`: nemainīgs izpildes laiks, atkārtojumu logs un parsētais notikums atpakaļ.

Pieprasījuma apstrādātājā

Webhook URL ir publisks. Jebkurš internetā var uz to nosūtīt POST ar pareizas formas JSON, tāpēc apstrādātājs, kas nolasa payload.type, nepārbaudot parakstu, ir atvērts rakstīšanas 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 })}

Padodiet NEAPSTRĀDĀTO pieprasījuma ķermeni. Parsēšana un atkārtota serializēšana maina atslēgu secību un atstarpes, un paraksts nesakritīs. headers pieņem Headers objektu vai vienkāršu objektu, piemēram, Node req.headers, un X-OpenEmail-Signature tiek atrasta neatkarīgi no burtu reģistra.

Divas lietas, ko tas paveic un ko pašrocīgi uzrakstīta pārbaude parasti neizdara: tas salīdzina MAC nemainīgā laikā, tāpēc pareizo prefiksu nevar atklāt, mērot izpildes laiku, un tas noraida piegādi, kas jebkurā virzienā ir vecāka par toleranceSeconds — piecas minūtes, ja vien nenorādāt citādi —, tāpēc pārtverts pieprasījums nav atkārtojams mūžīgi. toleranceSeconds: 0 izslēdz atkārtojumu pārbaudi. Abas kļūdas ir klusas. Apstrādātājs ar jebkuru no tām iztur visus testus, ko jums ienāktu prātā uzrakstīt.

Tas izmet kļūdu katrā neveiksmes gadījumā: ja trūkst X-OpenEmail-Signature galvenes, ja tā nav formā t=<seconds>,v1=<hex>, ja laikspiedols ir ārpus loga vai ja paraksts nesakrīt. Veiksmes gadījumā tas atgriež ķermeni, kas parsēts kā WebhookPayload, tāpēc nav otra JSON.parse, ko varētu sabojāt. Padodiet tipa argumentu, piemēram, EmailOpenedData, lai tipizētu data.

Tam nepieciešams globalThis.crypto.subtle, ko nodrošina gan Node 20+, gan Bun, Deno un Cloudflare Workers.