如何在 Google 云函数中获取原始请求 body?
How can I get the raw request body in a Google Cloud Function?
我需要原始请求 body 才能对其进行 SHA-1 消化,以验证与请求一起传递到我的 Firebase 函数的 Facebook webhook X-Hub-Signature header ( 运行宁 Google 云功能)。
问题是,在这种情况下(使用 Content-Type: application/json
header),GCF 使用 bodyParser.json()
自动解析 body,它使用流中的数据(这意味着它不能在 Express 中间件链中再次使用)并且只提供解析的 javascript object 作为 req.body
。原始请求缓冲区被丢弃。
我曾尝试向 functions.https.onRequest()
提供一个 Express 应用程序,但它似乎是 运行 作为一个 child 应用程序或已经有请求 body 的东西已解析,就像将普通 request-response 回调传递给 onRequest()
.
一样
有什么方法可以禁止 GCF 为我解析 body 吗?或者我能以某种方式指定我自己的 verify
回调到 bodyParser.json()
吗?或者有其他方法吗?
PS:一周前我第一次联系了 Firebase 支持,但由于那里没有回应,我现在在这里尝试。
不幸的是,默认中间件目前无法提供获取原始请求正文的方法。参见:Access to unparsed JSON body in HTTP Functions (#36252545).
现在您可以从 req.rawBody
获取原始 body。它returnsBuffer
。有关详细信息,请参阅 documentation。
感谢 Nobuhito Kurose 在 comments 中发布此内容。
const escapeHtml = require('escape-html');
/**
* Responds to an HTTP request using data from the request body parsed according
* to the "content-type" header.
*
* @param {Object} req Cloud Function request context.
* @param {Object} res Cloud Function response context.
*/
exports.helloContent = (req, res) => {
let name;
switch (req.get('content-type')) {
// '{"name":"John"}'
case 'application/json':
({name} = req.body);
break;
// 'John', stored in a Buffer
case 'application/octet-stream':
name = req.body.toString(); // Convert buffer to a string
break;
// 'John'
case 'text/plain':
name = req.body;
break;
// 'name=John' in the body of a POST request (not the URL)
case 'application/x-www-form-urlencoded':
({name} = req.body);
break;
}
res.status(200).send(`Hello ${escapeHtml(name || 'World')}!`);
};
我需要原始请求 body 才能对其进行 SHA-1 消化,以验证与请求一起传递到我的 Firebase 函数的 Facebook webhook X-Hub-Signature header ( 运行宁 Google 云功能)。
问题是,在这种情况下(使用 Content-Type: application/json
header),GCF 使用 bodyParser.json()
自动解析 body,它使用流中的数据(这意味着它不能在 Express 中间件链中再次使用)并且只提供解析的 javascript object 作为 req.body
。原始请求缓冲区被丢弃。
我曾尝试向 functions.https.onRequest()
提供一个 Express 应用程序,但它似乎是 运行 作为一个 child 应用程序或已经有请求 body 的东西已解析,就像将普通 request-response 回调传递给 onRequest()
.
有什么方法可以禁止 GCF 为我解析 body 吗?或者我能以某种方式指定我自己的 verify
回调到 bodyParser.json()
吗?或者有其他方法吗?
PS:一周前我第一次联系了 Firebase 支持,但由于那里没有回应,我现在在这里尝试。
不幸的是,默认中间件目前无法提供获取原始请求正文的方法。参见:Access to unparsed JSON body in HTTP Functions (#36252545).
现在您可以从 req.rawBody
获取原始 body。它returnsBuffer
。有关详细信息,请参阅 documentation。
感谢 Nobuhito Kurose 在 comments 中发布此内容。
const escapeHtml = require('escape-html');
/**
* Responds to an HTTP request using data from the request body parsed according
* to the "content-type" header.
*
* @param {Object} req Cloud Function request context.
* @param {Object} res Cloud Function response context.
*/
exports.helloContent = (req, res) => {
let name;
switch (req.get('content-type')) {
// '{"name":"John"}'
case 'application/json':
({name} = req.body);
break;
// 'John', stored in a Buffer
case 'application/octet-stream':
name = req.body.toString(); // Convert buffer to a string
break;
// 'John'
case 'text/plain':
name = req.body;
break;
// 'name=John' in the body of a POST request (not the URL)
case 'application/x-www-form-urlencoded':
({name} = req.body);
break;
}
res.status(200).send(`Hello ${escapeHtml(name || 'World')}!`);
};