Because of the way webhooks work, attackers can impersonate services by simply sending a fake webhook to an endpoint. Think about it: it’s just an HTTP POST from an unknown source. This can create a potential security vulnerability for many applications, or at the very least, a source of errors.

To prevent this, Crossmint signs every webhook and its metadata with a unique key for each endpoint. Use this signature to verify that the webhook indeed comes from Crossmint, and process it only if it does.

You can get the signing key secret from the Webhooks page in the console. To find it, go to the endpoint details and look for the Signing Secret section.

We are going to use the Svix open-source library to verify webhooks. First, install the relevant libraries for your language:

Next, verify webhooks using the code below. The payload is the raw (string) body of the request, and the headers are the headers passed in the request.

You need to use the raw request body when verifying webhooks, as the cryptographic signature is sensitive to even the slightest changes. Watch out for frameworks that parse the request as JSON and then stringify it, as this will break the signature verification.

See examples below for how to get the raw request body with different frameworks.

Remember to get the signature secret from the endpoint details in the console.