تجاوز إلى المحتوى الرئيسي
Didit تجمع 7.5 مليون دولار لبناء البنية التحتية للهوية والاحتيال
Didit
العودة إلى المدونة
المدونة · 6 مارس 2026

إنشاء مستمع Webhook لـ Didit باستخدام Fastify وPostgreSQL (AR)

تعلم كيفية بناء مستمع ويب هوك قوي وآمن لإشعارات Didit للتحقق من الهوية في الوقت الفعلي باستخدام Node.js وFastify وPostgreSQL.

بواسطة Diditتحديث
building-a-didit-webhook-listener-with-fastify-postgresql.png

تكامل الويب هوك الآمنيعد تطبيق التحقق من توقيع HMAC-SHA256 أمرًا بالغ الأهمية لضمان أصالة وسلامة حمولات ويب هوك Didit، وحماية تطبيقك من الطلبات المزورة والحفاظ على أمان البيانات.

معالجة البيانات في الوقت الفعلياستفد من الويب هوكس لتلقي إشعارات فورية حول تغييرات حالة جلسة التحقق من الهوية، مما يمكّن تطبيقك من التفاعل فورًا وأتمتة عمليات إعداد المستخدم أو إدارة المخاطر.

تخزين البيانات القابل للتطويراستفد من PostgreSQL لتخزين وإدارة بيانات الويب هوك بكفاءة، مما يتيح الاستعلام القوي والتدقيق والتكامل مع أنظمة إدارة المستخدم الحالية لديك، مما يضمن استمرارية البيانات وموثوقيتها.

ميزة Didit المعياريةتعمل منصة الهوية المعيارية ونظام الويب هوك الشامل من Didit على تبسيط التكامل، مما يوفر للمطورين واجهات برمجة تطبيقات نظيفة وتدفقات بيانات في الوقت الفعلي لبناء حلول KYC مرنة تعتمد على الذكاء الاصطناعي مع KYC الأساسي المجاني وبدون رسوم إعداد.

فهم ويب هوكس Didit وأهميتها

في عالم التحقق من الهوية، التغذية الراجعة في الوقت الفعلي أمر بالغ الأهمية. سواء كنت تقوم بإعداد مستخدمين جدد، أو منع الاحتيال، أو ضمان الامتثال، فإن معرفة حالة جلسة التحقق فور حدوثها أمر حيوي. هنا يأتي دور الويب هوكس. توفر ويب هوكس Didit طريقة آلية لتلقي إشعارات حول الأحداث التي تحدث ضمن سير عمل التحقق من الهوية الخاص بك، مثل اكتمال جلسة، أو فشلها، أو طلب المزيد من الإجراءات.

بدلاً من الاستقصاء المستمر لواجهة برمجة تطبيقات Didit للحصول على التحديثات، والذي يمكن أن يكون غير فعال ويؤدي إلى تأخيرات، تدفع الويب هوكس البيانات مباشرة إلى نقطة النهاية التي قمت بتكوينها. تضمن هذه البنية القائمة على الأحداث أن تطبيقك يمتلك دائمًا أحدث المعلومات، مما يتيح المعالجة الفورية وتجربة مستخدم أكثر سلاسة. على سبيل المثال، بمجرد أن يكمل المستخدم بنجاح التحقق من الهوية من Didit وفحوصات النشاط السلبي والنشط، يمكن لويب هوك أن يؤدي إلى الخطوة التالية في سير عمل الإعداد الخاص بك على الفور.

تقدم Didit إصدارات ويب هوك قابلة للتكوين، مع كون الإصدار 3 هو المعيار الموصى به لهيكله الشامل للحمولة. يمكنك تعيين عنوان URL الخاص بالويب هوك، والإصدار، وحتى تعريف سياسات الاحتفاظ بالبيانات مباشرة من خلال Didit Business Console أو عبر واجهة برمجة التطبيقات، مما يمنحك تحكمًا كاملاً في تدفق بياناتك والتزامات الامتثال.

إعداد مستمع ويب هوك Fastify الخاص بك

Fastify هو إطار عمل ويب سريع ومنخفض التكاليف لـ Node.js، مما يجعله خيارًا ممتازًا لبناء مستمعي ويب هوك عالية الأداء. إليك كيفية البدء:

1. إعداد المشروع والتبعيات

أولاً، قم بتهيئة مشروع Node.js الخاص بك وتثبيت الحزم الضرورية:

mkdir didit-webhook-listener
cd didit-webhook-listener
npm init -y
npm install fastify dotenv pg crypto

أنشئ ملف .env لتخزين مفتاح الويب هوك السري الخاص بـ Didit وتفاصيل اتصال PostgreSQL:

DIDIT_WEBHOOK_SECRET=your_didit_webhook_secret_key
DATABASE_URL=postgresql://user:password@host:port/database

يمكنك استرداد DIDIT_WEBHOOK_SECRET الخاص بك من Didit Business Console ضمن إعدادات التطبيق أو عبر نقطة نهاية GET /v3/webhook/ الخاصة بـ Didit API.

2. تكوين خادم Fastify

أنشئ ملف app.js. يحتاج Fastify إلى نص الطلب الخام للتحقق من التوقيع، لذلك سنقوم بتكوينه لعدم تحليل JSON تلقائيًا لمسار الويب هوك الخاص بنا.

require('dotenv').config();
const fastify = require('fastify')({ logger: true });
const crypto = require('crypto');
const { Client } = require('pg');

const DIDIT_WEBHOOK_SECRET = process.env.DIDIT_WEBHOOK_SECRET;
const DATABASE_URL = process.env.DATABASE_URL;

const pgClient = new Client({ connectionString: DATABASE_URL });

// Register a content parser for 'application/json' that leaves the body raw for specific routes
fastify.addContentTypeParser('application/json', { parseAs: 'buffer' }, function (req, body, done) {
  if (req.raw.url === '/webhooks/didit') {
    done(null, body); // Leave raw for webhook endpoint
  } else {
    try {
      const json = JSON.parse(body.toString());
      done(null, json);
    } catch (error) {
      error.statusCode = 400;
      done(error, undefined);
    }
  }
});

fastify.post('/webhooks/didit', async (request, reply) => {
  const signature = request.headers['x-signature'];
  const timestamp = request.headers['x-timestamp'];
  const rawBody = request.body;

  if (!signature || !timestamp || !rawBody) {
    reply.code(400).send({ message: 'Missing signature, timestamp, or body' });
    return;
  }

  // 1. Verify HMAC-SHA256 signature
  const expectedSignature = crypto
    .createHmac('sha256', DIDIT_WEBHOOK_SECRET)
    .update(`${timestamp}.${rawBody.toString()}`)
    .digest('hex');

  if (expectedSignature !== signature) {
    reply.code(403).send({ message: 'Invalid signature' });
    return;
  }

  // 2. Validate timestamp (e.g., within 5 minutes to prevent replay attacks)
  const fiveMinutesAgo = Date.now() - (5 * 60 * 1000);
  if (parseInt(timestamp) < fiveMinutesAgo) {
    reply.code(403).send({ message: 'Timestamp too old' });
    return;
  }

  // 3. Parse JSON body after verification
  let payload;
  try {
    payload = JSON.parse(rawBody.toString());
  } catch (error) {
    reply.code(400).send({ message: 'Invalid JSON payload' });
    return;
  }

  fastify.log.info('Received Didit webhook:', payload);

  // 4. Process the webhook payload (e.g., store in DB, update user status)
  try {
    await pgClient.query(
      'INSERT INTO webhooks (event_id, event_type, payload, received_at) VALUES ($1, $2, $3, NOW())',
      [payload.id, payload.event, JSON.stringify(payload)]
    );
    // Example: Update user status based on payload.status
    // await pgClient.query(
    //   'UPDATE users SET verification_status = $1 WHERE didit_session_id = $2',
    //   [payload.status, payload.session_id]
    // );
    reply.code(200).send({ message: 'Webhook received and processed' });
  } catch (dbError) {
    fastify.log.error('Database error:', dbError);
    reply.code(500).send({ message: 'Internal server error' });
  }
});

const start = async () => {
  try {
    await pgClient.connect();
    fastify.log.info('Connected to PostgreSQL');
    await fastify.listen({ port: 3000, host: '0.0.0.0' });
  } catch (err) {
    fastify.log.error(err);
    process.exit(1);
  }
};

start();

تخزين بيانات الويب هوك في PostgreSQL

يعد استمرار بيانات الويب هوك أمرًا بالغ الأهمية للتدقيق وتصحيح الأخطاء وضمان سلامة البيانات. PostgreSQL هي قاعدة بيانات علائقية قوية ومثالية لهذه المهمة.

1. مخطط قاعدة البيانات

أولاً، قم بإنشاء جدول لتخزين أحداث الويب هوك الخاصة بك. يوفر هذا المخطط نقطة بداية جيدة:

CREATE TABLE webhooks (
    id SERIAL PRIMARY KEY,
    event_id VARCHAR(255) UNIQUE NOT NULL, -- معرف حدث Didit الفريد
    event_type VARCHAR(255) NOT NULL,
    payload JSONB NOT NULL, -- تخزين الحمولة الكاملة بصيغة JSON
    received_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

2. التكامل مع Fastify

كما هو موضح في مثال app.js، نقوم بدمج عميل pg للاتصال بقاعدة بيانات PostgreSQL الخاصة بك وإدراج حمولة الويب هوك الواردة. يعد عمود payload JSONB NOT NULL مثاليًا لتخزين كائن JSON بأكمله، مما يسمح بالاستعلام المرن لاحقًا دون تغييرات مخطط محددة مسبقًا لكل حقل جديد قد تقدمه Didit.

تذكر معالجة أخطاء قاعدة البيانات المحتملة بشكل رشيق. يتضمن المثال أعلاه كتلة try-catch أساسية لعمليات قاعدة البيانات.

تأمين نقطة نهاية الويب هوك الخاصة بك

الأمان أمر بالغ الأهمية عند التعامل مع بيانات التحقق من الهوية الحساسة. تستخدم Didit توقيعات HMAC-SHA256 لضمان أن الويب هوكس الواردة شرعية وغير معبث بها.

1. التحقق من توقيع HMAC

يتضمن كل طلب ويب هوك من Didit رأسين حاسمين: X-Signature و X-Timestamp. يحتوي رأس X-Signature على توقيع HMAC-SHA256 تم إنشاؤه باستخدام مفتاح الويب هوك السري الفريد الخاص بك ونص الطلب الخام المدمج مع الطابع الزمني. يجب أن يقوم المستمع الخاص بك بما يلي:

  1. استرداد DIDIT_WEBHOOK_SECRET الخاص بك.
  2. استخراج رأسي X-Signature و X-Timestamp.
  3. إعادة بناء الحمولة الموقعة: `${timestamp}.${rawBody}`.
  4. إنشاء توقيع HMAC-SHA256 الخاص بك باستخدام سرك والحمولة المعاد بناؤها.
  5. مقارنة توقيعك الذي تم إنشاؤه مع X-Signature من الطلب. إذا لم يتطابقا، ارفض الطلب.

يوضح مثال Fastify المقدم هذه العملية بالضبط، مما يضمن معالجة ويب هوكس Didit الأصلية فقط.

2. التحقق من الطابع الزمني

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

كيف تساعد Didit

تم تصميم منصة Didit لجعل تكامل التحقق من الهوية سلسًا وآمنًا. تسمح لنا بنيتنا المعيارية بتوصيل وتشغيل فحوصات هوية مختلفة، من التحقق من الهوية لتحليل المستندات القوي إلى التحقق عبر NFC لفحوصات جواز السفر الإلكتروني/الهوية الإلكترونية عالية الأمان، وفحص ومراقبة AML للامتثال. يعد نظام الويب هوك مكونًا أساسيًا لهذه المعيارية، حيث يوفر تحديثات في الوقت الفعلي تمكنك من تنسيق سير عمل KYC المعقد دون استقصاء مستمر.

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

هل أنت مستعد للبدء؟

هل أنت مستعد لرؤية Didit في العمل؟ احصل على عرض توضيحي مجاني اليوم.

ابدأ في التحقق من الهويات مجانًا باستخدام الطبقة المجانية من Didit.

بنية تحتية للهوية والاحتيال.

واجهة برمجية واحدة لـ KYC و KYB ومراقبة المعاملات وفحص المحافظ. ادمجها في 5 دقائق.

اطلب من الذكاء الاصطناعي تلخيص هذه الصفحة
بناء مستمع ويب هوك لـ Didit باستخدام Fastify وPostgreSQL.