C#
تأیید وبهوکها
پیش از اعتماد به آنچه یک تحویل میگوید، امضای آن را بررسی کنید.
تأیید یک تحویل
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() برگردانده است.
بدنهٔ خام را، دقیقاً همانطور که رسیده، بدهید. بدنهای که تجزیه و دوباره رمزگذاری شده دیگر با امضایش مطابقت ندارد.
تحویلهای قدیمی
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 پاسخ دهید. تحویلی که هر پاسخ دیگری بگیرد بعداً دوباره امتحان میشود.