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 بسرعة. التسليم الذي يتلقى أي جواب آخر تُعاد محاولته لاحقًا.