Saltar para a documentação
Go

Verificar webhooks

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

Verificar uma entrega

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 lê o cabeçalho X-OpenEmail-Signature, verifica o seu HMAC sobre a marca temporal e o corpo em tempo constante, e devolve o evento como um openemail.Object. O segredo é o que client.Webhooks.Create 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.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)}

Uma entrega com mais de cinco minutos é recusada, por isso um pedido capturado não pode ser repetido mais tarde. openemail.WithTolerance 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 devolvem todos um erro que corresponde a openemail.ErrWebhookSignature.
  • 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.