Belgelere geç
Go

Webhook'ları doğrulama

Bir teslimatın söylediklerine güvenmeden önce imzasını doğrulayın.

Bir teslimatı doğrulama

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, X-OpenEmail-Signature üstbilgisini okur, zaman damgası ve gövde üzerindeki HMAC değerini sabit zamanda denetler ve olayı bir openemail.Object olarak döndürür. Gizli anahtar, client.Webhooks.Create yönteminin döndürdüğü anahtardır.

Ham gövdeyi, tam geldiği haliyle geçirin. Ayrıştırılıp yeniden kodlanmış bir gövde artık imzasıyla eşleşmez.

Eski teslimatlar

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

Beş dakikadan eski bir teslimat reddedilir, böylece ele geçirilmiş bir istek daha sonra yeniden oynatılamaz. openemail.WithTolerance bu beş dakikayı değiştirir, sıfır ise her yaştaki teslimatı kabul eder.

  • Eksik ya da hatalı biçimli bir üstbilgi, eşleşmeyen bir imza ve fazla eski bir teslimat, hepsi openemail.ErrWebhookSignature ile eşleşen bir hata döndürür.
  • Bir gizli anahtar döndürüldükten sonra bir teslimat birden fazla imza taşıyabilir ve eşleşen herhangi biri yeterlidir.
  • Hızlıca bir 2xx durumuyla yanıt verin. Başka bir yanıt alan teslimat daha sonra yeniden denenir.