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 برگردانده است.
بدنهٔ خام را، دقیقاً همانطور که رسیده، بدهید. بدنهای که تجزیه و دوباره رمزگذاری شده دیگر با امضایش مطابقت ندارد.
تحویلهای قدیمی
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 پاسخ دهید. تحویلی که هر پاسخ دیگری بگیرد بعداً دوباره امتحان میشود.