Go
Vérifier les webhooks
Vérifiez la signature d'une livraison avant de vous fier à ce qu'elle dit.
Vérifier une livraison
package main import ( "io" "log" "net/http" "os" "github.com/bfzli/openemail-go") func main() { secret := os.Getenv("OPENEMAIL_WEBHOOK_SECRET") http.HandleFunc("/webhooks/openemail", func(writer http.ResponseWriter, request *http.Request) { payload, err := io.ReadAll(http.MaxBytesReader(writer, request.Body, 1<<20)) if err != nil { writer.WriteHeader(http.StatusBadRequest) return } event, err := openemail.VerifyWebhookSignature(payload, request.Header, secret) if err != nil { writer.WriteHeader(http.StatusBadRequest) return } log.Println(event.String("type"), event.ID()) writer.WriteHeader(http.StatusNoContent) }) log.Fatal(http.ListenAndServe(":8080", nil))}openemail.VerifyWebhookSignature lit l'en-tête X-OpenEmail-Signature, vérifie son HMAC sur l'horodatage et le corps en temps constant, et renvoie l'événement sous forme d'openemail.Object. Le secret est celui que client.Webhooks.Create a renvoyé.
Passez le corps brut, exactement tel qu'il est arrivé. Un corps analysé puis réencodé ne correspond plus à sa signature.
Livraisons anciennes
payload := []byte(`{"id":"evt_1","type":"email.received"}`)headers := http.Header{"X-OpenEmail-Signature": {"t=1767225600,v1=5f2d"}} _, err := openemail.VerifyWebhookSignature(payload, headers, "whsec_example", openemail.WithTolerance(time.Minute)) if errors.Is(err, openemail.ErrWebhookSignature) { fmt.Println("refused:", err)}Une livraison de plus de cinq minutes est refusée : une requête interceptée ne peut donc pas être rejouée plus tard. openemail.WithTolerance change ces cinq minutes, et zéro accepte une livraison de n'importe quel âge.
- Un en-tête absent ou mal formé, une signature qui ne correspond pas et une livraison trop ancienne renvoient tous une erreur qui correspond à
openemail.ErrWebhookSignature. - Après la rotation d'un secret, une livraison peut porter plusieurs signatures, et il suffit que l'une d'elles corresponde.
- Répondez vite avec un statut 2xx. Une livraison qui reçoit une autre réponse est retentée plus tard.