خانه
بازگشت به مستندات
وب‌هوک‌ها

چطور مطمئن شوم یک وب‌هوک واقعاً از این سیستم آمده؟

HMAC-SHA256 بدنهٔ خام را با رمزتان دوباره حساب کنید و با سرآیند X-Webhook-Signature مقایسه کنید.

در پایان، سیستم دریافت‌کنندهٔ شما هر درخواستی را که با رمز شما امضا نشده رد می‌کند.

پیش از شروع

رمزی که برای نقطهٔ پایانی وارد کردید باید در دسترس کد دریافت‌کننده باشد، و دسترسی به بدنهٔ خام درخواست (بایت‌های دقیق، پیش از هر تجزیهٔ 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 نام رویداد را می‌گوید. ظرف ۱۰ ثانیه با وضعیتی در محدودهٔ ۲۰۰ پاسخ بدهید، وگرنه تحویل دوباره امتحان می‌شود.

آخرین به‌روزرسانی: