شرح Webhooks: الحمولات الموقعة واستراتيجيات إعادة المحاولة

Backend2026-10-19TryQuickToolBox

لقد قمت للتو بدمج خدمة طرف ثالث ترسل webhooks، وكل شيء يعمل بشكل جيد في الاختبار. ولكن في الإنتاج، لاحظت أحيانًا أحداثًا مفقودة، أو تسليمات مكررة، أو الأسوأ من ذلك - قيام جهة خبيثة بإرسال حمولات مزيفة إلى نقطة النهاية الخاصة بك. تعتبر Webhooks بسيطة من حيث المفهوم ولكنها صعبة في الممارسة. تشرح هذه المقالة كيفية تأمين webhooks باستخدام الحمولات الموقعة وتنفيذ استراتيجيات إعادة محاولة قوية حتى تتمكن من الوثوق بتكاملاتك المدفوعة بالأحداث.

ما هي Webhooks ولماذا تهم

Webhooks هي عمليات استدعاء HTTP محددة من قبل المستخدم يتم تشغيلها بواسطة أحداث معينة. عندما يحدث حدث - مثل نجاح الدفع أو تسجيل مستخدم جديد - ترسل الخدمة المصدر طلب HTTP POST إلى عنوان URL الذي تقدمه. هذا النموذج القائم على الدفع أكثر كفاءة من الاستقصاء، مما يقلل من زمن الوصول وحمل الخادم. ومع ذلك، فإنه يقدم تحديات: التحقق من الأصالة والتعامل مع فشل التسليم.

تأمين Webhooks باستخدام الحمولات الموقعة

بدون التحقق، يمكن لأي شخص إرسال طلبات إلى نقطة نهاية webhook الخاصة بك. تحل الحمولات الموقعة هذه المشكلة عن طريق تضمين توقيع تشفيري يثبت أن الطلب نشأ من المرسل الموثوق.

كيف تعمل توقيعات HMAC

تستخدم معظم مقدمي الخدمات HMAC (رمز مصادقة الرسائل القائم على التجزئة) مع سر مشترك. يحسب المرسل تجزئة للحمولة باستخدام السر ويضمينها في رأس (مثل X-Signature). يعيد خادمك حساب التجزئة ويقارنها. إذا تطابقت، فإن الطلب أصلي.

// مثال: التحقق من توقيع webhook في Node.js
const crypto = require('crypto');

function verifySignature(payload, signature, secret) {
  const hmac = crypto.createHmac('sha256', secret);
  hmac.update(payload);
  const digest = hmac.digest('hex');
  return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(digest));
}

هام: استخدم دائمًا مقارنة آمنة التوقيت لمنع هجمات التوقيت. أيضًا، تحقق من التوقيع مقابل جسم الطلب الخام، وليس كائن JSON تم تحليله، لأن التحليل يمكن أن يغير الحمولة.

أفضل الممارسات للتحقق من التوقيع

تنفيذ إعادة المحاولة الموثوقة

حتى مع الحمولات الموقعة، يمكن أن تتسبب مشكلات الشبكة أو الانقطاعات المؤقتة في فشل تسليم webhook. تضمن استراتيجية إعادة المحاولة القوية تسليم الأحداث في النهاية دون إرباك نظامك.

التراجع الأسي مع الاهتزاز

إعادة المحاولة فورًا يمكن أن تؤدي إلى تفاقم الازدحام. بدلاً من ذلك، استخدم التراجع الأسي: انتظر لفترة أطول بين كل إعادة محاولة. أضف اهتزازًا (تغييرًا عشوائيًا) لتجنب مشاكل القطيع الراعد عندما تفشل العديد من webhooks في وقت واحد.

// مثال: جدول إعادة المحاولة مع التراجع الأسي والاهتزاز
function getRetryDelay(attempt) {
  const base = 1000; // 1 ثانية
  const max = 30000; // 30 ثانية
  const delay = Math.min(base * Math.pow(2, attempt), max);
  return delay + Math.random() * 1000; // إضافة اهتزاز يصل إلى 1 ثانية
}

Idempotency: التعامل مع التكرارات

يمكن أن تتسبب إعادة المحاولة في تسليمات مكررة. يجب أن يكون معالج webhook الخاص بك idempotent - معالجة نفس الحدث عدة مرات يجب أن يكون لها نفس التأثير مثل معالجته مرة واحدة. استخدم معرف الحدث من الحمولة لتتبع الأحداث المعالجة.

الرد بسرعة والتأكيد

يجب أن تستجيب نقطة نهاية webhook الخاصة بك برمز حالة 2xx في أسرع وقت ممكن - ideally في غضون بضع ثوانٍ. إذا استغرقت المعالجة وقتًا أطول، فقم بوضع الحدث في قائمة الانتظار للمعالجة غير المتزامنة وأعد 202 Accepted. هذا يمنع المهلات وإعادة المحاولة غير الضرورية.

مقارنة: Webhook مقابل الاستقصاء

الجانب Webhooks الاستقصاء
زمن الوصول شبه فوري يعتمد على الفاصل الزمني
حمل الخادم منخفض (دفع فقط) مرتفع (طلبات مستمرة)
التعقيد أعلى (يحتاج إلى إعادة محاولة، أمان) أقل
الموثوقية يتطلب منطق إعادة المحاولة موثوق بطبيعته

خطوة بخطوة: بناء مستقبل webhook آمن

  1. قم بإعداد نقطة نهاية HTTPS بشهادة صالحة.
  2. استخرج رأس التوقيع (مثل X-Signature) والطابع الزمني.
  3. تحقق من التوقيع باستخدام السر المشترك والجسم الخام.
  4. تحقق من الطابع الزمني لرفض الطلبات القديمة (مثل الأقدم من 5 دقائق).
  5. حلل الحمولة وتحقق من معرفات الأحداث المكررة.
  6. عالج الحدث بشكل غير متزامن إذا لزم الأمر، واستجب بـ 200 OK.
  7. سجل الحدث للتدقيق وتصحيح الأخطاء.

الأسئلة الشائعة

ما هي حمولة webhook الموقعة؟

تتضمن الحمولة الموقعة توقيعًا تشفيريًا (عادة HMAC) يسمح للمستقبل بالتحقق من أن الطلب جاء من مصدر موثوق ولم يتم العبث به.

كم مرة يجب أن أعيد محاولة webhook فاشل؟

تعيد معظم الأنظمة المحاولة 3-5 مرات مع التراجع الأسي. بعد ذلك، يتم عادة وضع علامة على الحدث على أنه فاشل وقد يتطلب تدخلًا يدويًا أو معالجة قائمة الانتظار الميتة.

هل يمكنني استخدام webhooks بدون HTTPS؟

لا يُنصح بشدة بذلك. بدون HTTPS، يمكن اعتراض الحمولات والتوقيعات أو تعديلها. استخدم دائمًا TLS لنقاط نهاية webhook.

عند تصحيح حمولات webhook أو السجلات، فإن تنسيق JSON بشكل صحيح أمر ضروري. استخدم JSON Formatter الخاص بنا لطباعة وتنسيق والتحقق من حمولات JSON بسرعة.