Belgelere geç
Java

Webhook'ları doğrulama

Bir teslimatın söylediklerine güvenmeden önce imzasını doğrulayın.

Bir teslimatı doğrulama

WebhookHandler.java
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 üstbilgisini okur, zaman damgası ve gövde üzerindeki HMAC değerini sabit sürede denetler ve olayı bir Map<String, Object> olarak döndürür. Gizli anahtar, client.webhooks().create çağrısının döndürdüğü anahtardır.

Üstbilgiler, adları herhangi bir büyük küçük harf düzeninde olan ve değeri metin ya da metin listesi olan bir map'tir; bu yüzden exchange.getRequestHeaders() ve Spring'in HttpHeaders sınıfı olduğu gibi uyar. Üstbilginin kendi değeri de olur.

Ham gövdeyi, tam geldiği haliyle geçirin. Ayrıştırılıp yeniden kodlanmış bir gövde artık imzasıyla eşleşmez.

Eski teslimatlar

Tolerance.java
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());}

Beş dakikadan eski bir teslimat reddedilir, böylece ele geçirilmiş bir istek daha sonra yeniden oynatılamaz. Son bağımsız değişken olarak verilen bir Duration bu beş dakikayı değiştirir, Duration.ZERO ise her yaştaki teslimatı kabul eder.

  • Eksik ya da bozuk bir üstbilgi, eşleşmeyen bir imza ve çok eski bir teslimat; hepsi WebhookSignatureException fırlatır.
  • Bir gizli anahtar döndürüldükten sonra bir teslimat birden fazla imza taşıyabilir ve eşleşen herhangi biri yeterlidir.
  • Hızlıca bir 2xx durumuyla yanıt verin. Başka bir yanıt alan teslimat daha sonra yeniden denenir.