条纹验证Web挂钩签名HMAC sha254 HAPI.js

时间:2018-07-15 10:55:57

标签: node.js stripe-payments hapijs cryptojs ngrok

我正在尝试验证hapi.js应用程序中stripe发送的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,以便可以测试我的webhooks。这可能是个问题吗?谢谢

1 个答案:

答案 0 :(得分:2)

在哈比17号 从注释开始-在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)-因此,尽管我在此处发布了此内容,但并未将其标记为可接受的答案。