Ir a la documentación
C#

Verificar webhooks

Comprueba la firma de una entrega antes de fiarte de lo que dice.

Verificar una 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() comprueba el HMAC de la cabecera sobre la marca de tiempo y el cuerpo en tiempo constante, y devuelve el evento como un JsonObject. El segundo argumento es el valor de la cabecera X-OpenEmail-Signature, y otras sobrecargas aceptan las propias cabeceras de la petición. El secreto es el que devolvió client.Webhooks.CreateAsync().

Pasa el cuerpo sin procesar, tal como llegó. Un cuerpo que se analizó y se volvió a codificar ya no coincide con su firma.

Entregas antiguas

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

Una entrega con más de cinco minutos se rechaza, así que una petición capturada no se puede reproducir más tarde. toleranceSeconds: cambia esos cinco minutos, y cero acepta una entrega de cualquier antigüedad.

  • Una cabecera ausente o mal formada, una firma que no coincide y una entrega demasiado antigua lanzan todas OpenEmailWebhookException.
  • Después de rotar un secreto, una entrega puede llevar más de una firma, y basta con que coincida una.
  • Responde rápido con un estado 2xx. Una entrega que recibe cualquier otra respuesta se reintenta más tarde.