Zur Dokumentation springen
Go

Webhooks prüfen

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

Eine Zustellung prüfen

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 liest den Header X-OpenEmail-Signature, prüft seinen HMAC über den Zeitstempel und den Körper in konstanter Zeit und gibt das Ereignis als openemail.Object zurück. Das Geheimnis ist das, das client.Webhooks.Create 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.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)}

Eine Zustellung, die älter als fünf Minuten ist, wird abgelehnt, sodass eine abgefangene Anfrage später nicht erneut abgespielt werden kann. openemail.WithTolerance ä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 geben alle einen Fehler zurück, der openemail.ErrWebhookSignature entspricht.
  • 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.