تخطَّ إلى المستندات
C#

التحقق من الويب هوك

تحقق من توقيع التسليم قبل أن تثق بما يقوله.

التحقق من تسليم

Program.cs
using OpenEmail; var builder = WebApplication.CreateBuilder(args);var app = builder.Build();var secret = builder.Configuration["OPENEMAIL_WEBHOOK_SECRET"] ?? string.Empty; app.MapPost("/webhooks/openemail", async (HttpRequest request) =>{    using var reader = new StreamReader(request.Body);    var payload = await reader.ReadToEndAsync();     try    {        var delivery = OpenEmailClient.VerifyWebhookSignature(payload, request.Headers["X-OpenEmail-Signature"], secret);         app.Logger.LogInformation("{Type} {Id}", (string?)delivery["type"], (string?)delivery["id"]);         return Results.NoContent();    }    catch (OpenEmailWebhookException)    {        return Results.BadRequest();    }}); app.Run();

تتحقق OpenEmailClient.VerifyWebhookSignature() من HMAC الخاص بالترويسة على الطابع الزمني والجسم في زمن ثابت، وتعيد الحدث على شكل JsonObject. الوسيط الثاني هو قيمة الترويسة X-OpenEmail-Signature، وهناك تحميلات أخرى تأخذ ترويسات الطلب نفسها. السر هو الذي أعادته client.Webhooks.CreateAsync().

مرّر الجسم الخام كما وصل تمامًا. الجسم الذي حُلِّل ثم رُمِّز من جديد لم يعد يطابق توقيعه.

التسليمات القديمة

tolerance.cs
var payload = """{"id":"evt_1","type":"email.received"}"""; try{    OpenEmailClient.VerifyWebhookSignature(payload, "t=1767225600,v1=5f2d", "whsec_example", toleranceSeconds: 60);}catch (OpenEmailWebhookException error){    Console.WriteLine($"refused: {error.Message}");}

التسليم الذي مضى عليه أكثر من خمس دقائق يُرفض، فلا يمكن إعادة تشغيل طلب ملتقَط لاحقًا. يغيّر toleranceSeconds: الدقائق الخمس، والصفر يقبل تسليمًا بأي عمر.

  • الترويسة المفقودة أو غير الصحيحة، والتوقيع الذي لا يطابق، والتسليم القديم جدًا، كلها ترمي OpenEmailWebhookException.
  • بعد تدوير السر، قد يحمل التسليم أكثر من توقيع، ويكفي أن يطابق أحدها.
  • أجب بحالة 2xx بسرعة. التسليم الذي يتلقى أي جواب آخر تُعاد محاولته لاحقًا.