वेबहुक सत्यापित करें
किसी डिलीवरी की बात पर भरोसा करने से पहले उसका हस्ताक्षर जाँचें।
एक डिलीवरी सत्यापित करें
import com.sun.net.httpserver.HttpExchange;import com.sun.net.httpserver.HttpHandler;import java.io.IOException;import java.nio.charset.StandardCharsets;import java.util.Map;import uk.openemail.OpenEmail;import uk.openemail.exception.WebhookSignatureException; public final class WebhookHandler implements HttpHandler { @Override public void handle(HttpExchange exchange) throws IOException { String rawBody = new String(exchange.getRequestBody().readAllBytes(), StandardCharsets.UTF_8); String secret = System.getenv("OPENEMAIL_WEBHOOK_SECRET"); int status = 204; try { Map<String, Object> event = OpenEmail.verifyWebhookSignature(rawBody, exchange.getRequestHeaders(), secret); System.out.println(event.get("type") + " " + event.get("id")); } catch (WebhookSignatureException error) { status = 400; } exchange.sendResponseHeaders(status, -1); exchange.close(); }}OpenEmail.verifyWebhookSignature X-OpenEmail-Signature हेडर पढ़ता है, टाइमस्टैम्प और बॉडी पर उसका HMAC स्थिर समय में जाँचता है, और इवेंट को एक Map<String, Object> के रूप में लौटाता है। सीक्रेट वही है जो client.webhooks().create ने लौटाया था।
हेडर एक map हैं जिसमें नाम किसी भी केस में हो सकते हैं और हर मान टेक्स्ट या टेक्स्ट की सूची होता है, इसलिए exchange.getRequestHeaders() और Spring का HttpHeaders जैसे हैं वैसे ही चल जाते हैं। हेडर का मान सीधे देना भी चलता है।
कच्ची बॉडी ठीक वैसी ही पास करें जैसी वह आई थी। जिस बॉडी को पार्स करके दोबारा एनकोड किया गया हो वह अब अपने हस्ताक्षर से मेल नहीं खाती।
पुरानी डिलीवरी
String signature = "t=1767225600,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd";Map<String, String> headers = Map.of("X-OpenEmail-Signature", signature); try { OpenEmail.verifyWebhookSignature("{}", headers, System.getenv("OPENEMAIL_WEBHOOK_SECRET"), Duration.ofMinutes(1));} catch (WebhookSignatureException error) { System.err.println(error.getMessage());}पाँच मिनट से ज़्यादा पुरानी डिलीवरी अस्वीकार कर दी जाती है, इसलिए पकड़ा गया अनुरोध बाद में दोबारा नहीं चलाया जा सकता। आख़िरी आर्ग्युमेंट के रूप में एक Duration इन पाँच मिनट को बदलता है, और Duration.ZERO किसी भी उम्र की डिलीवरी स्वीकार करता है।
- गायब या बिगड़ा हुआ हेडर, मेल न खाने वाला हस्ताक्षर और बहुत पुरानी डिलीवरी, सभी
WebhookSignatureExceptionथ्रो करते हैं। - सीक्रेट बदलने के बाद एक डिलीवरी में एक से ज़्यादा हस्ताक्षर हो सकते हैं, और उनमें से किसी एक का मेल खाना काफ़ी है।
- जल्दी से 2xx स्टेटस के साथ जवाब दें। जिस डिलीवरी को कोई और जवाब मिलता है उसे बाद में दोबारा आज़माया जाता है।