Go
Webhook'ları doğrulama
Bir teslimatın söylediklerine güvenmeden önce imzasını doğrulayın.
Bir teslimatı doğrulama
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
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.ErrWebhookSignatureile 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.