Node.js верификация webhook
Пример кода для верификации вебхуков на nodejs¶
Нам нужно проверить подпись, присланную в заголовке Content-Signature
. Код для проверки может выглядеть так:
const crypto = require('crypto');
/**
* функция принимает нераспарсенное тело запроса и заголовок Content-Signature
*/
function verififyWebhookSignature(rawBody, contentSignatureHeader): boolean {
const digest = contentSignatureHeader.replace(/alg=(\S+);\sdigest=/, '');
const verify = crypto.createVerify('SHA256');
verify.update(rawBody);
verify.end();
return verify.verify(webhookPublicKey, deUrlSafe(digest), 'base64');
}
function deUrlSafe(base64UrlSafe) {
return base64UrlSafe.replace(/_/g, '/').replace(/-/g, '+').replace(/,/g, '');
}
Пример использования этих функций с koa, koa-body и koa-router
import Koa from 'koa';
import bodyParser from 'koa-body';
import Router from 'koa-router';
const router = new Router();
// код middleware для вебхука
router.post('/webhook', ctx => {
const unparsed = Symbol.for('unparsedBody');
const ok = verififyWebhookSignature(ctx.request.body[unparsed], ctx.request.headers['content-signature']);
console.log({ ok });
// дальше делаем что-нибудь с данными присланными в вебхуке
ctx.status = 200;
});
app.use(router.routes());
app.use(router.allowedMethods());