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

Backend2026-09-18TryQuickToolBox

لقد قمت للتو بدمج بوابة دفع أو خدمة CI/CD، والآن تحتاج إلى استقبال الأحداث في الوقت الفعلي. تُعد Webhooks الحل القياسي، لكنها تأتي مع مخاطر: حمولات غير موثقة، وأحداث مفقودة، وعمليات تسليم مكررة. تشرح هذه المقالة كيفية عمل Webhooks، وكيفية توقيع الحمولات لمنع التلاعب، وكيفية تنفيذ إعادة المحاولات للتسليم الموثوق.

ما هي Webhooks؟

Webhook هو استدعاء HTTP معرف من قبل المستخدم. بدلاً من أن يقوم تطبيقك بالاستعلام عن واجهة برمجة التطبيقات (API) للحصول على التحديثات، يرسل المزود طلب HTTP POST إلى عنوان URL تحدده كلما حدث حدث معين. هذا أكثر كفاءة ويتيح ردود فعل شبه فورية.

تشمل حالات الاستخدام الشائعة:

لماذا توقيع حمولات Webhook؟

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

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

كيفية التحقق من التوقيع

إليك دليل خطوة بخطوة:

  1. استرجع الجسم الخام تماماً كما تم إرساله. لا تقم بتحليله أو تعديله قبل التحقق.
  2. استخرج التوقيع من الترويسة.
  3. احسب التوقيع المتوقع باستخدام HMAC-SHA256 مع السر الخاص بك.
  4. قارن باستخدام دالة زمن ثابت لمنع هجمات التوقيت.

مثال في Node.js:

const crypto = require('crypto');

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

في Python:

import hmac
import hashlib

def verify_signature(payload, signature, secret):
    expected = hmac.new(secret.encode(), payload, hashlib.sha256).hexdigest()
    return hmac.compare_digest(f'sha256={expected}', signature)

استخدم دائماً مقارنة زمن ثابت لتجنب تسريب المعلومات.

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

تفشل الشبكات، وتُعاد تشغيل الخوادم، وتحدث عمليات النشر. يجب أن يقوم نظام Webhook القوي بإعادة محاولة التسليمات الفاشلة. عادةً ما يعيد المزودون المحاولة مع تراجع أسي، ولكن يجب عليك أيضاً التعامل مع إعادة المحاولات على جانب الاستقبال.

استراتيجيات إعادة المحاولة

مفاتيح اللا تكرارية

يتضمن العديد من المزودين معرف حدث فريد (مثل X-Event-ID). خزّن المعرفات المعالجة في قاعدة بيانات أو ذاكرة تخزين مؤقت لتخطي التكرارات. على سبيل المثال، استخدم Redis مع TTL لتتبع المعرفات التي تم رؤيتها.

مقارنة: الاستعلام الدوري مقابل Webhooks

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

أفضل الممارسات لمستهلكي Webhook

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

ما هو توقيع Webhook؟

توقيع Webhook هو تجزئة HMAC للحمولة، تم إنشاؤها باستخدام سر مشترك. يسمح للمستقبل بالتحقق من أن الطلب جاء من المرسل المتوقع ولم يتم التلاعب به.

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

لا يوجد رقم عالمي، لكن 3-5 محاولات مع تراجع أسي أمر شائع. بعد ذلك، سجّل الحدث في قائمة الرسائل الميتة للمراجعة اليدوية.

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

تقنياً نعم، لكنه غير آمن للغاية. استخدم دائماً HTTPS لتشفير الحمولات ومنع هجمات الوسيط.

هل أنت مستعد لاختبار نقاط نهاية Webhook الخاصة بك؟ استخدم JSON Formatter لفحص الحمولات والتحقق منها بسرعة.