如何在 nodejs 中创建签名的 webhook 请求?

How to create signed webhook requests in nodejs?

我有 2 个 nodejs 微服务(我们称它们为服务 x 和服务 y)。在服务 x 中,我将向服务 y 发出 POST 个请求。

假设服务 x 将 POST 在服务 y 的这个 HTTPs 端点:/order/orderId

我认为服务 x 是 webhooks 生产者,服务 y 是 webhooks 消费者。

我希望服务 y 能够确保消息来自服务 x,而不是来自任何恶意来源。为此,我想在服务 x 发出 POST 服务 y 请求之前签署请求。

我有哪些选择来签署这些请求?如何在服务 x 中签署这些请求,以及如何在服务 y 中验证这些请求?我还有哪些 signing/encryption 选项?

nodejs 中的具体代码示例将有很大帮助。

您可以在两个服务之间独占使用密钥,并用它来签署请求。

在发件人(服务 x)中:

  • 为 HTTP POST 请求添加自定义 header,x-webhook-signature,这将是使用密钥 sha256 HMAC 生成的:
function createHmacSignature(req) {
  return require("crypto")
    .createHmac("sha256", secretKey)
    .update(JSON.stringify(req.body))
    .digest("hex");
}

在接收器(服务y)中:

  • 获取签名header:
req.headers["x-webhook-signature"]
  • 使用密钥,如上所述再次创建 HMAC
  • 将结果字符串与 x-webhook-signature header 进行比较,如果它们匹配,则请求源将是预期的。
function compareSignatures (signature, comparison_signature) {
  const source = Buffer.from(signature);
  const comparison = Buffer.from(comparison_signature);
  return require("crypto").timingSafeEqual(source, comparison);
}

当然可以做额外的验证和增强,这是保证只有服务x可以发送请求的正常流程。