【问题标题】:How to create signed webhook requests in nodejs?如何在 nodejs 中创建签名的 webhook 请求?
【发布时间】:2021-10-23 08:39:06
【问题描述】:

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

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

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

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

我有哪些选项可以签署这些请求?如何在服务 x 中签署这些请求,以及如何在服务 y 中验证这些请求?我还有哪些签名/加密选项?

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

【问题讨论】:

  • 你试过什么?当你尝试它时发生了什么?
  • 我还没有尝试过任何东西,我正在寻找一种解决方案来安全地处理服务 y 中的 webhook --- 这是从服务 x 生成/触发的。 @马特摩根
  • github webhook 文档解释了你需要的过程,而且做得相当漂亮。 docs.github.com/en/developers/webhooks-and-events/webhooks/…

标签: javascript node.js encryption webhooks signing


【解决方案1】:

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

在发件人(服务 x)中:

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

在接收器中(服务 y):

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

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

【讨论】:

  • 感谢您的回复。如果我们在 2 个服务之间共享一个密钥,我还需要使用 x-public-key 来识别服务 x 吗?另外,我可以使用任何 GUID 值作为密钥吗?这会是一个不错的选择吗?如果没有,我应该如何生成一个? @Majed
  • 不,如果只期望 x 发送请求,则不需要公钥。密钥可以是任何随机字符串,通常以sk_ 开头用于生产,sk_test_ 用于沙盒。
猜你喜欢
  • 2021-08-07
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多