الـ API والتكامل
الـ Webhooks
الصيغة
كل webhook هو HTTP POST بجسم JSON:
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"event": "education.students.created",
"tenant_id": 42,
"created_at": "2026-04-26T10:30:15+03:00",
"data": {
"student": { "id": 123, "full_name": "...", ... }
}
}
Headers
| Header | الوصف |
|---|---|
X-Okta-Event |
اسم الحدث |
X-Okta-Delivery-Id |
UUID فريد، ثابت عبر إعادة المحاولات للـ deduplication |
X-Okta-Timestamp |
Unix timestamp وقت التوقيع |
X-Okta-Signature |
HMAC-SHA256 hex |
التحقق من التوقيع
$expected = hash_hmac(
'sha256',
$request->header('X-Okta-Timestamp') . '.' . $request->getContent(),
$YOUR_WEBHOOK_SECRET,
);
if (! hash_equals($expected, $request->header('X-Okta-Signature'))) {
return response('invalid signature', 401);
}
حماية من Replay
افحص أن X-Okta-Timestamp ضمن آخر 5 دقائق، وخزّن X-Okta-Delivery-Id
لمدة 15 دقيقة على الأقل لرفض إعادة الإرسال.
إعادة المحاولة
أوكتا يعيد المحاولة مع backoff: 30s → 2m → 10m → 1h → 6h. بعد 6 محاولات بدون 2xx، يُعتبر التسليم فاشلاً نهائياً ويُسجَّل في صفحة "تسليمات Webhook" في لوحة الشريك.
مهم: ردّك يجب أن يكون 2xx خلال 10 ثوانٍ. لو احتجت معالجة طويلة، اقبل الـ webhook بـ 202 Accepted فوراً وعالج خلفياً.