شرح Webhooks: الحمولات الموقعة وإعادة المحاولة
لقد قمت ببناء API وتحتاج الآن إلى إخطار الخدمات الأخرى عند حدوث الأحداث. قمت بإعداد نقطة نهاية webhook، لكنك تدرك بسرعة أن تسليم طلبات HTTP بشكل موثوق أصعب مما يبدو. يمكن أن تسبب أعطال الشبكة والمهاجمين الخبثاء والأحداث المكررة الفوضى. يشرح هذا الدليل كيفية تنفيذ webhooks مع حمولات موقعة وإعادة المحاولة حتى تتمكن من بناء تكامل قوي.
ما هي Webhooks؟
Webhooks هي عمليات استدعاء HTTP معرفة من قبل المستخدم. عند حدوث حدث في تطبيقك، ترسل طلب HTTP POST إلى عنوان URL يقدمه المشترك. هذا يسمح بالتواصل في الوقت الفعلي بين الخدمات دون استقصاء.
على سبيل المثال، قد يرسل معالج الدفع webhook إلى تطبيقك عند نجاح عملية دفع. يمكن لتطبيقك بعد ذلك تحديث حالة الطلب على الفور.
لماذا توقيع حمولات Webhook؟
نقاط نهاية webhook متاحة للعامة، لذا يمكن لأي شخص إرسال طلبات مزيفة. بدون التحقق، قد يعالج تطبيقك أحداثًا احتيالية. يضمن توقيع الحمولات أن الطلب نشأ من خدمتك ولم يتم التلاعب به.
يستخدم التوقيع عادةً سرًا مشتركًا بين المرسل والمستقبل. يحسب المرسل رمز مصادقة الرسائل المستند إلى التجزئة (HMAC) على الحمولة ويتضمنه في رأس. يعيد المستقبل حساب HMAC ويقارنه.
كيفية إنشاء التوقيعات والتحقق منها
تستخدم معظم التطبيقات HMAC-SHA256. إليك مثال بسيط في Python:
import hmac
import hashlib
import json
def generate_signature(payload, secret):
body = json.dumps(payload, separators=(',', ':')).encode('utf-8')
signature = hmac.new(secret.encode('utf-8'), body, hashlib.sha256).hexdigest()
return signature
def verify_signature(payload, signature, secret):
expected = generate_signature(payload, secret)
return hmac.compare_digest(expected, signature)
عند إرسال webhook، قم بتضمين التوقيع في رأس مثل X-Signature. يستخرج المستقبل النص الأصلي، ويعيد حساب HMAC، ويقارن. استخدم دائمًا دالة مقارنة ثابتة الوقت لمنع هجمات التوقيت.
تنفيذ إعادة المحاولة للتسليم الموثوق
يتم إرسال webhooks عبر الإنترنت، لذا فإن الفشل أمر لا مفر منه. قد يكون خادمك معطلاً، أو قد تكون الشبكة بطيئة، أو قد يعيد المشترك خطأً. إعادة المحاولة مع التراجع الأسي ضرورية.
استراتيجية إعادة المحاولة
النهج الشائع هو إعادة المحاولة بتأخيرات متزايدة: دقيقة واحدة، 5 دقائق، 30 دقيقة، ساعتين، إلخ. توقف بعد عدد أقصى من المحاولات (على سبيل المثال، 10) أو نافذة زمنية إجمالية (على سبيل المثال، 24 ساعة).
أعد المحاولة فقط في ظروف محددة: أخطاء الشبكة، استجابات 5xx، أو 429 (طلبات كثيرة جدًا). لا تعد المحاولة في أخطاء 4xx (باستثناء 429) لأنها تشير إلى خطأ من العميل لن يتم إصلاحه بإعادة المحاولة.
مثال على منطق إعادة المحاولة
إليك آلية إعادة محاولة مبسطة في Python باستخدام مكتبة requests:
import requests
import time
from requests.exceptions import RequestException
def send_webhook(url, payload, secret, max_retries=5):
headers = {'Content-Type': 'application/json'}
signature = generate_signature(payload, secret)
headers['X-Signature'] = signature
for attempt in range(max_retries):
try:
response = requests.post(url, json=payload, headers=headers, timeout=10)
if response.status_code < 500 and response.status_code != 429:
return response.status_code
except RequestException:
pass
# Exponential backoff with jitter
delay = (2 ** attempt) + (random.random() * 0.1)
time.sleep(delay)
return None # Failed after retries
في الإنتاج، ستخزن المحاولات الفاشلة في قائمة انتظار وتعالجها بشكل غير متزامن. يمكن أن تساعد أدوات مثل Celery أو قوائم انتظار السحابة (AWS SQS، Google Cloud Tasks).
أفضل الممارسات لأمان Webhook
- استخدم HTTPS: أرسل دائمًا webhooks عبر TLS لمنع التنصت.
- ضمّن طابعًا زمنيًا: أضف طابعًا زمنيًا إلى الحمولة وارفض الطلبات الأقدم من بضع دقائق لمنع هجمات إعادة التشغيل.
- قم بتدوير الأسرار: قم بتغيير سر التوقيع بشكل دوري ودعم أسرار نشطة متعددة أثناء التدوير.
- تحقق من عنوان URL: عند تسجيل webhook، تأكد من أن عنوان URL يمكن الوصول إليه ويعيد 2xx لطلب اختبار.
- تحديد المعدل: احمِ مرسل webhook الخاص بك من سوء الاستخدام عن طريق تحديد عدد الطلبات لكل مشترك.
التعامل مع التكرارات والتناسب
يمكن أن تسبب إعادة المحاولة عمليات تسليم مكررة. قم بتضمين معرف حدث فريد في الحمولة واطلب من المستقبل تتبع المعرفات المعالجة. إذا تم رؤية معرف حدث من قبل، فتجاهله.
بدلاً من ذلك، صمم معالجات الأحداث الخاصة بك لتكون متناسبة. على سبيل المثال، تحديث سجل بنفس البيانات عدة مرات يجب أن يكون له نفس تأثير القيام بذلك مرة واحدة.
اختبار Webhooks
استخدم أدوات مثل ngrok لكشف خادمك المحلي واختبار تسليم webhook. حاكي حالات الفشل عن طريق إرجاع رموز الخطأ وتحقق من حدوث إعادة المحاولة كما هو متوقع.
الأسئلة الشائعة
ما هي حمولة webhook الموقعة؟
تتضمن الحمولة الموقعة توقيعًا تشفيريًا (عادة HMAC) يسمح للمستقبل بالتحقق من أن الطلب جاء من مصدر موثوق ولم يتم تغييره.
كم مرة يجب أن أعيد محاولة webhook فاشل؟
يعتمد ذلك على احتياجات الموثوقية لديك. الممارسة الشائعة هي 5-10 محاولات إعادة مع تراجع أسي على مدار 24 ساعة. اسمح دائمًا للمشتركين بتشغيل إعادة المحاولة يدويًا.
هل يمكنني استخدام webhooks بدون توقيع؟
يمكنك، لكنه محفوف بالمخاطر. بدون توقيع، يمكن لأي شخص إرسال أحداث مزيفة. قم دائمًا بتوقيع webhooks في الإنتاج لمنع الاحتيال.
هل أنت مستعد لاختبار حمولات webhook الخاصة بك؟ استخدم JSON Formatter الخاص بنا للتحقق من حمولات JSON وتنسيقها بشكل جميل قبل الإرسال.