Skip to main content
Het pakket installeren
Language

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 pakkettypes lopen achter op de payload

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!",
    };
});
Was this page helpful?