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 错误:未找到与有效负载的预期签名匹配的签名

条带错误:未找到与有效负载的预期签名匹配的签名

NextJS Stripe Webhook 原始正文

无法将数据从 Stripe webhook 发送到 Firebase