در پایان، سیستم دریافتکنندهٔ شما هر درخواستی را که با رمز شما امضا نشده رد میکند.
پیش از شروع
رمزی که برای نقطهٔ پایانی وارد کردید باید در دسترس کد دریافتکننده باشد، و دسترسی به بدنهٔ خام درخواست (بایتهای دقیق، پیش از هر تجزیهٔ JSON).
مراحل
۱. سرآیند X-Webhook-Signature را بخوانید. شبیه sha256=<ارقام هگز> است.
۲. یک HMAC با SHA-256 روی بدنهٔ خام حساب کنید، با رمزتان بهعنوان کلید، و آن را بهصورت هگز بنویسید.
۳. با بخش بعد از sha256= مقایسه کنید، با مقایسهٔ زمانثابت.
۴. اگر فرق داشت، با وضعیت خطا پاسخ بدهید و با رویداد کاری نکنید.
برای نمونه در Node:
import { createHmac, timingSafeEqual } from 'node:crypto';
function isValid(rawBody, header, secret) {
const expected = createHmac('sha256', secret).update(rawBody).digest('hex');
const given = String(header).replace(/^sha256=/, '');
return (
given.length === expected.length &&
timingSafeEqual(Buffer.from(given), Buffer.from(expected))
);
}
چه چیزی میبینید
تحویلهای اصلی میگذرند. هر چیزی که کسی که فقط نشانی شما را میداند بفرستد رد میشود.
اگر مشکلی پیش آمد
- بدنهٔ خام را امضا کنید، نه نسخهٔ دوبارهسریالشده: تجزیهگری که JSON را جابهجا یا بازقالببندی کند امضا را عوض میکند.
- بدنه
tsدارد، زمان ارسال، پس در هر تلاش عوض میشود. امضا کل بدنه را میپوشاند، پس هر تلاش امضای خودش را دارد؛ این عادی است. - برای نادیده گرفتن تکراری از
X-Webhook-Deliveryاستفاده کنید: در تلاشهای مجدد ثابت میماند و یک رویداد ممکن است بیش از یکبار تحویل شود. X-Webhook-Eventنام رویداد را میگوید. ظرف ۱۰ ثانیه با وضعیتی در محدودهٔ ۲۰۰ پاسخ بدهید، وگرنه تحویل دوباره امتحان میشود.