JavaScript-pakket
Gebruik het JavaScript-pakket van cside om webhook-handtekeningen te verifiëren en notificatiegebeurtenissen af te handelen met volledige TypeScript-ondersteuning.
Het pakket installeren
Installeer het cside webhooks-pakket:
npm i @cside.dev/webhooks
Het pakket gebruiken
constructEvent(body, signature, secret) verifieert de x-cside-signature-header
tegen de ruwe verzoekbody en retourneert de geparseerde gebeurtenis. Het werpt
Error("Invalid signature") als de handtekening niet overeenkomt, dus plaats
de aanroep in een try/catch en antwoord in dat geval met 400.
import { constructEvent } from "@cside.dev/webhooks";
const rawBody = req.rawBody; // The raw request body as a string; how you get it depends on your HTTP framework
const signature = req.headers["x-cside-signature"]; // Sent with every cside webhook request
const event = await constructEvent(
rawBody,
signature,
process.env.CSIDE_WEBHOOK_SECRET, // The secret you configured on the webhook destination
);
switch (event.event) {
case "alert.created": {
const alert = event.data;
console.log({
domainId: event.domain_id,
target: alert.target,
action: alert.action,
});
}
}
Het pakket exporteert ook verifyHmac(body, signature, secret) als u alleen de
handtekening wilt controleren en de body zelf wilt parsen.
De types Event en AlertCreatedObject die met @cside.dev/webhooks worden
meegeleverd, beschrijven een oudere payload. De engine stuurt timestamp
(niet sent_at), plus domain en trigger_type op het hoogste niveau, en
het data-object gebruikt target_type en bevat ruleset_*- en
vuln_*-velden. Het pakket typeert bovendien alleen alert.created, niet de
samenvattingsgebeurtenissen. Raadpleeg de
payload-referentie
voor de velden die daadwerkelijk worden verstuurd, en cast of valideer de
geretourneerde gebeurtenis dienovereenkomstig.
Voorbeelden
import Fastify from 'fastify';
import { constructEvent } from "@cside.dev/webhooks";
const fastify = Fastify({ logger: true });
await fastify.register(import('@fastify/raw-body'), {
field: 'rawBody',
global: false,
routes: ['/webhook']
});
fastify.post('/webhook', {
config: { rawBody: true }
}, async (request, reply) => {
const signature = request.headers['x-cside-signature'];
const webhookEvent = await constructEvent(
request.rawBody,
signature,
process.env.CSIDE_WEBHOOK_SECRET!,
);
switch (webhookEvent.event) {
case "alert.created": {
const alert = webhookEvent.data;
console.log({
domainId: webhookEvent.domain_id,
target: alert.target,
action: alert.action,
});
}
}
});import { createKaitoHandler, KaitoError } from "@kaito-http/core";
import { constructEvent } from "@cside.dev/webhooks";
const app = router()
.get("/", async ({ ctx }) => {
return {
uptime: ctx.uptime,
time_now: Date.now(),
};
})
.post("/", async ({ ctx }) => {
const signature = ctx.req.headers.get("x-cside-signature");
if (!signature) {
throw new KaitoError(400, "Missing signature");
}
const rawBody = await ctx.req.text();
const webhookEvent = await constructEvent(
rawBody,
signature,
process.env.CSIDE_WEBHOOK_SECRET!,
);
switch (webhookEvent.event) {
case "alert.created": {
const alert = webhookEvent.data;
console.log({
domainId: webhookEvent.domain_id,
target: alert.target,
action: alert.action,
});
}
}
return {
message: "OK!",
};
});Thanks for your feedback!