如何从环回自定义方法检索原始正文缓冲区,以验证来自 webhook POST 的条带签名



遵循以下指南:https://stripe.com/docs/webhooks/signatures#verify-official-libraries

我已经在环回自定义方法中尝试了以下代码:

    "use strict";
module.exports = function(Webhook) {
  Webhook.stripe = function(req, data, cb) {
    const stripe = require("stripe")("sk_test_xxxxxxxxxxxxx");
    const endpointSecret = "whsec_xxxxxxxxxxxxxxxxxxxxxxxxx";
    const sig = req.headers["stripe-signature"];
    let event;
    try {
      event = stripe.webhooks.constructEvent(data, sig, endpointSecret);
      Webhook.create({
        data: data
      }); 
      console.log("Success");
      cb(null, "OK");
    } catch (err) {
      console.log(err);
      Webhook.create({
        data: err 
      }); 
      cb(err);
    }   
  };  
  Webhook.remoteMethod("stripe", {
    accepts: [
      { arg: "req", type: "object", http: { source: "req" } },
      { arg: "data", type: "object", http: { source: "body" } } 
    ],  
    returns: [{ arg: "response", type: "any", root: true }]
  }); 
};

但是在stripe.webhooks.constructEvent中验证签名时,传入正文的数据对象将不起作用,因为它不想要对象,它想要原始的未编辑正文。(JSON.Stringify(( 也不起作用,因为这会更改正文并且验证失败(如何从环回获取原始未编辑正文以传递到条纹库进行签名验证?

感谢 https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/loopbackjs/I2LK5gOkP_4/rn73-B0ABwAJ 的费利佩·菲格罗亚(Felipe Figueroa(的回答。

body-parser 将根据内容类型根据正文解析器类型(在本例中为 JSON 或 raw(解析传入的请求。不能将原始解析器和 json 解析器设置为按顺序应用

为了解决这个问题,我们可以从中间件中删除bodyParser.json,并在服务器中手动配置它.js

由于我们需要原始主体,但也需要转换后的 JSON,因此我们可以在 JSON 解析器激活之前添加一个额外的属性来请求对象,如下所示:

在中间件.json中:

"parse": {
    "body-parser#json": {"params": {"limit": "10mb", "strict": false}}, // remove this line
    "body-parser#urlencoded": {
      "params": {
        "extended": true,
        "limit": "5mb"
      }
    }

在服务器中.js:

function rawBodySaver(req, res, buf, encoding) {
  if (buf && buf.length) {
    req.rawBody = buf.toString(encoding || 'utf8'); // additional property set on req object
  }
}
const bodyParser = require('body-parser');
app.use(bodyParser.json({limit: '10mb', strict: false, verify: rawBodySaver}));

然后在上面的代码中,我们将使用:

event = stripe.webhooks.constructEvent(req["rawBody"], sig, endpointSecret);

然后签名正确验证。

最新更新