羽毛中获取原始请求主体

时间:2019-11-28 11:44:27

标签: feathersjs

我尝试为羽毛实现WooCommerce Webhook功能。为了验证请求,我需要像这样验证原始请求主体的签名

const isSignatureValid = (
      secret: string,
      body: any,
      signature?: string
    ): boolean => {
      const signatureComputed = crypto
        .createHmac("SHA256", secret)
        .update(new Buffer(JSON.stringify(body), "utf8"))
        .digest("base64");

      return signatureComputed === signature ? true : false;
    };

目前,我的签名从未验证过。我的猜测是,由于req.body不是请求的原始原始内容,而是添加了featherjs优点的某些已经解析的版本。

问题是:如何在标准的Feathers应用程序(使用Feathers cli创建)中获取原始请求正文?

3 个答案:

答案 0 :(得分:1)

不确定这是否是最惯用的方式,但是我想出了以下几点:

在主app.ts文件的express.json()中,可以将未解析的原始主体添加到req对象。这很方便,因为对于某些Webhooks(woocommerce,stripe),您只需要原始主体即可验证签名,否则可以使用已解析的JSON。

export interface IRequestRawBody extends http.IncomingMessage {
  rawBody: Buffer;
}

app.use(
  express.json({
    verify: (req: IRequestRawBody, res, buf) => {
      const rawEndpoints: string[] = ["/wc-webhook"];

      if (req.url && rawEndpoints.includes(req.url)) {
        req.rawBody = buf;
      }
    }
  })
);

答案 1 :(得分:0)

  // Initialize our service with any options it requires
  app.use('/country', function (req, res, next) {
     console.log(req);
     next();
    }, new Country(options, app)
    );

我们可以在服务类的快速中间件中获得如上所述的请求正文。

答案 2 :(得分:0)

这是来自@florian-norbert-bepunkt 的原始答案的扩展,因为对我来说它不是开箱即用的......我还需要一个字符串版本的正文来计算安全哈希。

app.use(express.json({
   verify: (req, res, buf) => {
    const rawEndpoints = ["/someAPI"];
     
    if (req.url && rawEndpoints.includes(req.url)) {
      req.feathers = {dataRawBuffer: buf};
    }
  }
}));

之后,您可以从上下文访问原始缓冲区

context.params.dataRawBuffer

我可以确认这适用于feathersJS v4,也许这会对某人有所帮助。