Zur Dokumentation springen
C#

Webhooks prüfen

Prüfen Sie die Signatur einer Zustellung, bevor Sie ihrem Inhalt vertrauen.

Eine Zustellung prüfen

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() prüft den HMAC des Headers über den Zeitstempel und den Körper in konstanter Zeit und gibt das Ereignis als JsonObject zurück. Das zweite Argument ist der Wert des Headers X-OpenEmail-Signature, und andere Überladungen nehmen die Anfrage-Header selbst. Das Geheimnis ist das, das client.Webhooks.CreateAsync() zurückgegeben hat.

Übergeben Sie den rohen Körper, genau wie er ankam. Ein Körper, der geparst und neu kodiert wurde, passt nicht mehr zu seiner Signatur.

Alte Zustellungen

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}");}

Eine Zustellung, die älter als fünf Minuten ist, wird abgelehnt, sodass eine abgefangene Anfrage später nicht erneut abgespielt werden kann. toleranceSeconds: ändert die fünf Minuten, und null akzeptiert eine Zustellung jeden Alters.

  • Ein fehlender oder fehlerhafter Header, eine Signatur, die nicht passt, und eine zu alte Zustellung lösen alle OpenEmailWebhookException aus.
  • Nachdem ein Geheimnis rotiert wurde, kann eine Zustellung mehr als eine Signatur tragen, und jede passende genügt.
  • Antworten Sie schnell mit einem 2xx-Status. Eine Zustellung, die eine andere Antwort bekommt, wird später erneut versucht.