如何在 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可以发送请求的正常流程。
我有 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可以发送请求的正常流程。