एक सार्वजनिक रिसीविंग URL किसी से भी अनुरोध प्राप्त कर सकता है। कोई हमलावर उस URL पर एक फर्जी इवेंट भेज सकता है, इसलिए अनुरोध को काम ट्रिगर करने से पहले प्रमाणित करना ज़रूरी है।
Bird Standard Webhooks साइनिंग स्कीम का उपयोग करता है। यह बॉडी के साथ इवेंट आइडेंटिफ़ायर और प्रयास समय को भी प्रमाणित करता है, इसलिए इनमें से कुछ भी बदलने पर सिग्नेचर अमान्य हो जाता है।
Bird क्या साइन करता है?
Bird इवेंट आइडेंटिफ़ायर, डिलीवरी-प्रयास टाइमस्टैम्प और रॉ रिक्वेस्ट बॉडी को पीरियड्स से जोड़कर साइन करता है।
सिग्नेचर सत्यापित करने तक रिक्वेस्ट बॉडी को अपरिवर्तित रखें। JSON को पार्स और सीरियलाइज़ करने से Bird द्वारा साइन किए गए बाइट्स बदल सकते हैं।
| हेडर | यह क्या ले जाता है |
|---|---|
webhook-id | इवेंट आइडेंटिफ़ायर, जो फिर से प्रयासों और रीप्ले में दोबारा उपयोग होता है। |
webhook-timestamp | प्रयास का समय, सेकंड में Unix टाइमस्टैम्प के रूप में। |
webhook-signature | एक या अधिक सिग्नेचर, स्पेस से अलग किए हुए। हर एक v1, से शुरू होता है। |
टाइमस्टैम्प को सेकंड से कनवर्ट करें, उसके बाद ही ऐसी क्लॉक से तुलना करें जो मिलीसेकंड में रिपोर्ट करती है।
अपने एंडपॉइंट सीक्रेट से whsec_ प्रीफ़िक्स हटाएँ और शेष को base64-डिकोड करके की बाइट्स प्राप्त करें।
आइडेंटिफ़ायर, टाइमस्टैम्प और अपरिवर्तित बॉडी को पीरियड्स से जोड़ें। डिकोड की गई की का उपयोग करके उस स्ट्रिंग पर HMAC-SHA256 कंप्यूट करें। परिणाम की हर दिए गए सिग्नेचर से constant-time comparison द्वारा तुलना करें, जिसकी रनिंग टाइम यह उजागर नहीं करती कि कौन से बाइट्स मैच हुए।
मेरा सिग्नेचर कभी मैच क्यों नहीं होता?
गलत सीक्रेट या बदली हुई रिक्वेस्ट बॉडी से हर सिग्नेचर जाँच विफल हो सकती है।
वेब फ़्रेमवर्क अक्सर आपके हैंडलर के चलने से पहले JSON को पार्स कर लेते हैं। उस ऑब्जेक्ट को दोबारा सीरियलाइज़ करने से व्हाइटस्पेस, की ऑर्डर या न्यूमेरिक फ़ॉर्मैटिंग बदल सकती है। परिणामस्वरूप JSON का अर्थ वही हो सकता है लेकिन सिग्नेचर अलग बनता है।
इस रूट को उसकी रॉ बॉडी संरक्षित रखने के लिए कॉन्फ़िगर करें। जाँचें कि सीक्रेट इसी एंडपॉइंट का है, विशेषकर डिप्लॉयमेंट या रोटेशन के बाद।
मेरे हैंडलर को क्या अस्वीकार करना चाहिए?
जब कोई सिग्नेचर मैच न हो या साइन किया गया टाइमस्टैम्प अनुमत समय विंडो से बाहर हो, तो अनुरोध अस्वीकार करें।
webhook-signature में हर सिग्नेचर आज़माएँ। सीक्रेट रोटेशन के दौरान एक डिलीवरी कई वैध सीक्रेट्स के सिग्नेचर ले जाती है। किसी भी मैचिंग सिग्नेचर को स्वीकार करने से दोनों सीक्रेट का उपयोग करने वाले रिसीवर काम करते रहते हैं।
अपनी क्लॉक के दोनों ओर पाँच मिनट की टाइमस्टैम्प सहनशीलता रखें। दस मिनट पहले का कैप्चर किया गया अनुरोध तब भी विफल होता है, भले ही उसका सिग्नेचर अपरिवर्तित हो। अपने सर्वर की क्लॉक सटीक रखें ताकि वह वास्तविक डिलीवरी को अस्वीकार न करे।
webhook-id को पहले से संग्रहीत इवेंट्स के विरुद्ध जाँचें। पहचाने गए डुप्लिकेट को उसका काम दोहराए बिना सफलता मिलनी चाहिए, क्योंकि उसी डिलीवरी को फिर से प्रयास करने से कोई नया इवेंट नहीं जुड़ता।
अगर मैं डिलीवरी अस्वीकार करूँ तो क्या होता है?
Bird ऐसी डिलीवरी को फिर से प्रयास करता है जिसे एरर रिस्पॉन्स मिलता है या टाइमआउट से पहले कोई रिस्पॉन्स नहीं मिलता।
उदाहरण के लिए 400 रिस्पॉन्स अस्वीकृति रिकॉर्ड करता है और डिलीवरी को फिर से प्रयास के लिए योग्य छोड़ देता है। सभी नॉन-2xx रिस्पॉन्स फिर से प्रयास करने की नीति का पालन करते हैं। यह कोड आपको अपने लॉग में विफलता का निदान करने में मदद करता है।
यह शेड्यूल समायोजन से पहले लगभग 27.5 घंटे तक फैला होता है, जिससे आपको गलत सीक्रेट ठीक करने का समय मिलता है। विफल webhook फिर से प्रयास शेड्यूल और उसके बाद छूटे हुए इवेंट्स को रीप्ले करने का तरीका बताता है।
2xx तभी लौटाएँ जब आपने इवेंट को सत्यापित और सुरक्षित रूप से संग्रहीत कर लिया हो, या पहले से संग्रहीत डुप्लिकेट को पहचान लिया हो। Bird रीप्ले के दौरान सफल डिलीवरी को छोड़ देता है, इसलिए असत्यापित अनुरोध को स्वीकार करना उस तंत्र के ज़रिए रिकवरी को रोकता है।
क्या मुझे सत्यापन स्वयं लागू करना होगा?
जब आप Bird SDK में webhooks.unwrap का उपयोग करते हैं तो आपको सत्यापन स्वयं लागू करने की ज़रूरत नहीं है। इसे रॉ बॉडी और रिक्वेस्ट हेडर पास करें।
यह हेल्पर डिकोड किया गया इवेंट लौटाने से पहले सिग्नेचर और टाइमस्टैम्प की जाँच करता है। आपका ऐप्लिकेशन फिर भी webhook-id से डीडुप्लिकेट करता है, क्योंकि पूर्ण हुए काम का रिकॉर्ड उसी के पास होता है।
एक संगत Standard Webhooks सत्यापन लाइब्रेरी वही जाँचें कर सकती है। webhooks गाइड में उदाहरण और एक मैनुअल इम्प्लीमेंटेशन शामिल है।
संक्षेप में
मूल बाइट्स को सत्यापित करें।
JSON को पार्स और सीरियलाइज़ करने से वे बाइट्स बदल सकते हैं जिन पर Bird ने साइन किया था। सत्यापन के लिए रॉ बॉडी को संरक्षित रखें।
सिग्नेचर के साथ समय भी जाँचें।
पाँच मिनट की टाइमस्टैम्प सहनशीलता कैप्चर किए गए अनुरोधों के पुन: उपयोग को सीमित करती है। संग्रहीत इवेंट्स को webhook-id से अलग से डीडुप्लिकेट करें।
हर दिए गए सिग्नेचर को आज़माएँ।
रोटेशन से ओवरलैपिंग सिग्नेचर बनते हैं। किसी भी वैध सिग्नेचर से मैच होने पर डिप्लॉयमेंट जारी रह सकता है।
केवल सत्यापित और संग्रहीत इवेंट्स को स्वीकार करें।
Bird नॉन-2xx रिस्पॉन्स पर फिर से प्रयास करता है और रीप्ले के दौरान सफल डिलीवरी को छोड़ देता है। पहले से संग्रहीत डुप्लिकेट के लिए उनका काम दोहराए बिना सफलता लौटाएँ।