shopify webhook完整性检查是nodejs表示失败

时间:2018-04-11 02:00:26

标签: node.js express shopify

关注this

我收到错误 - 未处理的承诺拒绝(拒绝ID:2):TypeError:第一个参数必须是字符串,Buffer,ArrayBuffer,Array或类似数组的对象

所以我改为

   var msg = JSON.stringify(req.rawBody);
   var digest = crypto.createHmac('sha256', APP_SHARED_SECRET)
                     .update(Buffer.from(msg,'utf8'))
                    .digest('base64');

生成的签名(hmac-sha256)与我在请求标头中收到的签名不同!

任何线索或指针都会有所帮助。

3 个答案:

答案 0 :(得分:0)

您可能希望在执行任何其他操作之前使用JSON.parse而不是JSON.stringify来解析消息。

答案 1 :(得分:0)

我正在处理类似的问题,但您想使用

new Buffer(....) 

答案 2 :(得分:0)

对于仍在寻找解决方案的任何人,这对我来说都是有效的

const rawBody = req.rawBody; // expressjs

// omitted
...

const digest = crypto
    .createHmac("sha256", process.env.SHOPIFY_WEBHOOK_SECRET)
    .update(data)
    .digest("base64");

return crypto.timingSafeEqual(
    Buffer.from(digest, "utf8"),
    Buffer.from(req.headers["http_x_shopify_hmac_sha256"], "utf8")
);

我在Vercel中使用无服务器功能,因此我使用了外部npm软件包raw-body来获取正确的原始内容

const rawBody = await getRawBody(req);

注释

  • hmac比较需要原始主体,因为req.body是已解析的对象,并且JSON.stringify弄乱了原始有效负载。
  • 将hmac与crypto.timingSafeEqual进行比较,此功能可以最大程度地防止泄漏时间信息。