Latihan 1 dari materi Webhooks di API — praktek dengan editor kode interaktif, test case otomatis, dan hint terpandu. Langsung jalan di browser.
Lengkapi route POST /webhooks/payment di starter. express, crypto, WEBHOOK_SECRET (isinya "webhook-secret"), dan const signature = req.headers["x-signature"] || "" sudah ada, biarkan tetap.
- Pasang
express.raw({ type: "application/json" }) di route-nya, di antara path dan handler, supaya req.body berisi Buffer: byte body persis seperti yang dikirim gateway.
- Hitung signature yang seharusnya dari byte itu:
crypto.createHmac("sha256", WEBHOOK_SECRET).update(req.body).digest("hex"). Jangan dari JSON.stringify(req.body): susunan ulangnya membuang spasi, byte-nya beda, dan webhook asli ditolak.
- Bandingkan dengan
crypto.timingSafeEqual, yang butuh dua Buffer sama panjang: const a = Buffer.from(signature, "hex") dan const b = Buffer.from(expected, "hex"). Kalau a.length !== b.length atau !crypto.timingSafeEqual(a, b), jawab res.status(401).json({ error: "Invalid signature" }).
- Cocok: jawab
res.status(200).json({ received: true }).
Tester-nya mengirim empat request ke POST /webhooks/payment. Yang pertama webhook asli dari pelajaran, {"id": "evt_1001", ...} dengan spasi setelah titik dua dan koma, dengan signature yang benar: harus dijawab 200 dengan {"received": true}. Lalu body yang sama dengan signature hasil JSON.stringify(req.body), body yang sama dengan signature abc yang panjangnya salah, dan body bawaan tester tanpa signature: ketiganya harus dijawab 401, bukan 500.
Kodemu juga harus memuat createHmac( dan timingSafeEqual(.