Stripe 验证 web-hook 签名 HMAC sha254 HAPI.js
Posted
技术标签:
【中文标题】Stripe 验证 web-hook 签名 HMAC sha254 HAPI.js【英文标题】:Stripe verify web-hook signature HMAC sha254 HAPI.js 【发布时间】:2018-12-23 04:01:38 【问题描述】:我正在尝试在我的 hapi.js 应用程序中验证条带发送的 webhook。 我已按照此处详述的说明进行操作:
https://stripe.com/docs/webhooks/signatures
(我显然没有在这里发布我的端点密码:)
<!-- language: lang-js -->
const enpointSecret = ######;
const sig = _.fromPairs(request.headers["stripe-signature"].split(',')
.map(s => s.split('=')));
// produces object eg t: '1111', v1: '111111..', v0: '...' etc
const signed_payload = `$sig.t.$JSON.stringify(request.payload)`;
const hmac = crypto.createHmac('sha256', endpointSecret)
.update(signed_payload)
.digest('hex');
生成的 hmac 与标头 (sig.v1) 中的签名不匹配。我不知道我做错了什么......
我正在本地开发 - 并使用 ngrok,以便我可以测试我的 webhook。这可能是一个问题吗?谢谢
【问题讨论】:
JSON.stringify
将改变请求正文。您需要在从 Stripe 收到的确切原始请求正文上生成 MAC,否则签名将不匹配。另外,为什么不直接使用stripe-node?
更多信息here
谢谢。我尝试了条带节点-但它对此不起作用...试图弄清楚如何在 hapi 中获取原始有效负载...设置 options.payload.parse = false 什么都不做...
【参考方案1】:
在 Hapi 17 中, 从 cmets 开始 - 在 Hapi 17 中,您必须防止解析主体。我在房子周围跳舞,设置有效负载配置的输出......但你不需要这样做。简单地将payload.parse设置为false
<!-- language: lang-js -->
module.exports =
method: 'POST',
path: '/api/webhook',
config:
auth: false,
payload:
parse: false // the important bit
,
handler: async (request, h) =>
然后我就可以使用内置的条带方法
<!-- language: lang-js -->
try
let event = stripe.webhooks.constructEvent( request.payload.toString(), request.headers["stripe-signature"], endpointSecret);
console.log(event);
catch (err)
console.log(err)
真正的功劳应该归功于 Karl Reid - 所以虽然我在这里发布了这个,但我没有将它标记为接受的答案。
【讨论】:
不用担心,您应该接受这一点,因为它向人们展示了如何以 Stripe 要求使用 hapi 的格式获取请求正文。 会做 - 谢谢。我必须再等 15 个小时才能让我这样做。 我在request.paylod.toString()
之后收到了Method get TypedArray.prototype.length called on incompatible receiver [object Object]
。 Hapi 19,节点 14以上是关于Stripe 验证 web-hook 签名 HMAC sha254 HAPI.js的主要内容,如果未能解决你的问题,请参考以下文章
Stripe webhook 错误:未找到与有效负载的预期签名匹配的签名
“Webhook 的签名不在 Stripe-Signature 标头中。”
带有 Google Cloud Functions 的 Stripe webhook 不断给出 Webhook 错误:未找到与有效负载的预期签名匹配的签名