Aller à la documentation
Go

Vérifier les webhooks

Vérifiez la signature d'une livraison avant de vous fier à ce qu'elle dit.

Vérifier une livraison

webhook.go
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

tolerance.go
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.