پرش به مستندات
Go

تأیید وب‌هوک‌ها

پیش از اعتماد به آنچه یک تحویل می‌گوید، امضای آن را بررسی کنید.

تأیید یک تحویل

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 را می‌خواند، HMAC آن را روی مُهر زمانی و بدنه در زمان ثابت بررسی می‌کند، و رویداد را به‌صورت یک openemail.Object برمی‌گرداند. راز همان است که client.Webhooks.Create برگردانده است.

بدنهٔ خام را، دقیقاً همان‌طور که رسیده، بدهید. بدنه‌ای که تجزیه و دوباره رمزگذاری شده دیگر با امضایش مطابقت ندارد.

تحویل‌های قدیمی

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

تحویلی که بیش از پنج دقیقه از آن گذشته رد می‌شود، پس درخواستِ شنودشده را نمی‌توان بعداً بازپخش کرد. openemail.WithTolerance آن پنج دقیقه را تغییر می‌دهد، و صفر تحویلی با هر قدمتی را می‌پذیرد.

  • سرآیند ناموجود یا بدشکل، امضایی که مطابقت ندارد و تحویلی که بیش از حد قدیمی است، همگی خطایی برمی‌گردانند که با openemail.ErrWebhookSignature مطابقت دارد.
  • پس از چرخاندن یک راز، یک تحویل می‌تواند بیش از یک امضا داشته باشد، و مطابقت هر یک کافی است.
  • سریع با وضعیت 2xx پاسخ دهید. تحویلی که هر پاسخ دیگری بگیرد بعداً دوباره امتحان می‌شود.