在羽毛中获取原始请求体
Get raw request body in feathers
我尝试为羽毛实现 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 创建)中获取原始请求正文?
不确定这是否是最惯用的方法,但我想出了以下方法:
在主 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;
}
}
})
);
// Initialize our service with any options it requires
app.use('/country', function (req, res, next) {
console.log(req);
next();
}, new Country(options, app)
);
我们可以在service class.
的express中间件中获取如上请求体
这是@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,也许这会对某人有所帮助。
我尝试为羽毛实现 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 创建)中获取原始请求正文?
不确定这是否是最惯用的方法,但我想出了以下方法:
在主 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;
}
}
})
);
// Initialize our service with any options it requires
app.use('/country', function (req, res, next) {
console.log(req);
next();
}, new Country(options, app)
);
我们可以在service class.
的express中间件中获取如上请求体这是@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,也许这会对某人有所帮助。