Saltar para a documentação
C#

Verificar webhooks

Verifique a assinatura de uma entrega antes de confiar no que ela diz.

Verificar uma entrega

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() verifica o HMAC do cabeçalho sobre a marca temporal e o corpo em tempo constante, e devolve o evento como um JsonObject. O segundo argumento é o valor do cabeçalho X-OpenEmail-Signature, e outras sobrecargas aceitam os próprios cabeçalhos do pedido. O segredo é o que client.Webhooks.CreateAsync() devolveu.

Passe o corpo em bruto, exatamente como chegou. Um corpo que foi analisado e codificado de novo já não corresponde à sua assinatura.

Entregas antigas

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

Uma entrega com mais de cinco minutos é recusada, por isso um pedido capturado não pode ser repetido mais tarde. toleranceSeconds: altera os cinco minutos, e zero aceita uma entrega de qualquer idade.

  • Um cabeçalho em falta ou mal formado, uma assinatura que não corresponde e uma entrega demasiado antiga lançam todos OpenEmailWebhookException.
  • Depois de um segredo ser rodado, uma entrega pode trazer mais do que uma assinatura, e basta que uma corresponda.
  • Responda depressa com um estado 2xx. Uma entrega que recebe qualquer outra resposta é tentada de novo mais tarde.