Verifikoni webhook-ët
Kontrolloni nënshkrimin e një dorëzimi para se t'i besoni asaj që thotë.
Verifikoni një dorëzim
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 lexon kokën X-OpenEmail-Signature, kontrollon HMAC-un e saj mbi vulën kohore dhe trupin në kohë konstante, dhe e kthen ngjarjen si Map<String, Object>. Sekreti është ai që ktheu client.webhooks().create.
Kokat janë një map me emra në çfarëdo shkrimi dhe me tekst ose një listë tekstesh si vlerë, kështu që exchange.getRequestHeaders() dhe HttpHeaders të Spring-ut përshtaten siç janë. Edhe vetë vlera e kokës funksionon.
Jepni trupin e papërpunuar, pikërisht siç mbërriti. Një trup që është analizuar dhe koduar sërish nuk përputhet më me nënshkrimin e vet.
Dorëzime të vjetra
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());}Një dorëzim më i vjetër se pesë minuta refuzohet, kështu që një kërkesë e kapur nuk mund të riluhet më vonë. Një Duration si argumenti i fundit i ndryshon pesë minutat, dhe Duration.ZERO pranon një dorëzim të çdo moshe.
- Një kokë që mungon ose është e keqformuar, një nënshkrim që nuk përputhet dhe një dorëzim tepër i vjetër hedhin të gjitha
WebhookSignatureException. - Pasi një sekret rrotullohet, një dorëzim mund të mbajë më shumë se një nënshkrim, dhe mjafton që njëri të përputhet.
- Përgjigjuni shpejt me një status 2xx. Një dorëzim që merr çdo përgjigje tjetër riprovohet më vonë.