Verifikimi i një dërgese
`verifyWebhookSignature`: në kohë konstante, me një dritare replay, dhe me ngjarjen e parsuar si kthim.
Në një handler kërkese
Një URL webhook-u është publike. Çdo gjë në internet mund të bëjë POST me JSON të formës së duhur drejt saj, ndaj një handler që lexon payload.type pa kontrolluar nënshkrimin është një API shkrimi e hapur.
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 })}Jepni trupin E PAPËRPUNUAR. Parsimi dhe riserializimi ndryshojnë renditjen e çelësave dhe hapësirat, dhe nënshkrimi nuk do të përputhet. headers merr një objekt Headers ose një objekt të thjeshtë, si req.headers i Node-it, kurse X-OpenEmail-Signature gjendet pavarësisht shkronjave të mëdha a të vogla.
Dy gjëra që kjo i trajton e që një kontroll i bërë me dorë zakonisht nuk i trajton: e krahason MAC-un në kohë konstante, që parashtesa e saktë të mos nxirret duke i matur kohën, dhe e refuzon një dërgesë më të vjetër se toleranceSeconds në të dy drejtimet — pesë minuta, veç nëse thoni ndryshe — që një kërkesë e kapur të mos jetë e riluajtshme përgjithmonë. toleranceSeconds: 0 e çaktivizon kontrollin e replay-t. Të dy këta defekte janë të heshtur. Një handler me cilindo prej tyre i kalon të gjitha testet që do t'ju shkonte mendja të shkruanit.
Hedh gabim në çdo dështim: një header X-OpenEmail-Signature që mungon, një që nuk është në formën t=<seconds>,v1=<hex>, një vulë kohore jashtë dritares, ose një nënshkrim që nuk përputhet. Në rast suksesi kthen trupin e parsuar si WebhookPayload, ndaj nuk ka një JSON.parse të dytë për ta bërë gabim. Jepni një argument tipi, si EmailOpenedData, për t'i vënë tip data-s.
I duhet globalThis.crypto.subtle, të cilin e ofrojnë të gjithë: Node 20+, Bun, Deno dhe Cloudflare Workers.