如何在 Hapijs 中获取原始请求体的缓冲区?
How can I get the buffer of the raw request body in Hapijs?
用body-parser + expressjs就可以了。但我的问题是:如何在 Hapijs 中获取原始请求体的缓冲区?
我正在与之交谈的东西就像 body-parser npm 包的这个函数中的 buf
参数:verify(req,res, buf, encoding)
messenger-platform-samples 示例中的此函数需要它:
function verifyRequestSignature(req, res, buf) {
var signature = req.headers["x-hub-signature"];
if (!signature) {
console.error("Couldn't validate the signature.");
} else {
var elements = signature.split('=');
var method = elements[0];
var signatureHash = elements[1];
var expectedHash = crypto.createHmac('sha1', APP_SECRET)
.update(buf)
.digest('hex');
if (signatureHash != expectedHash) {
throw new Error("Couldn't validate the request signature.");
}
}
}
编辑:
我需要在使用 server.ext()
的中间件中使用它,如下所示:
server.ext({
type: 'onRequest',
method: (request, reply) => {
var signature = request.headers["x-hub-signature"];
if (!signature) {
console.error("Couldn't validate the signature.");
} else {
var elements = signature.split('=');
var method = elements[0];
var signatureHash = elements[1];
var expectedHash = crypto.createHmac('sha1', APP_SECRET)
.update(request.payload)
.digest('hex');
if (signatureHash != expectedHash) {
throw new Error("Couldn't validate the request signature.");
}
return reply.continue();
}
}
});
在hapi@16.1.0
中:
这是获取原始缓冲区和原始缓冲区的方法 headers:
'use strict';
const Hapi = require('hapi');
const server = new Hapi.Server();
server.connection({
host: 'localhost',
port: 8000
});
server.route({
method: 'POST',
path:'/',
handler: function (request, reply) {
console.log(request.payload);
console.log(request.raw.req.headers);
return reply('hello world');
},
config: {
payload: {
output: 'data',
parse: false
}
}
});
server.start((err) => {
if (err) throw err;
console.log('Server running at:', server.info.uri);
});
运行 示例:
$ curl -X POST 'http://localhost:8000/' -d name=nehaljwani --trace-ascii /dev/stdout
Note: Unnecessary use of -X or --request, POST is already inferred.
== Info: Trying 127.0.0.1...
== Info: TCP_NODELAY set
== Info: Connected to localhost (127.0.0.1) port 8000 (#0)
=> Send header, 148 bytes (0x94)
0000: POST / HTTP/1.1
0011: Host: localhost:8000
0027: User-Agent: curl/7.51.0
0040: Accept: */*
004d: Content-Length: 15
0061: Content-Type: application/x-www-form-urlencoded
0092:
=> Send data, 15 bytes (0xf)
0000: name=nehaljwani
== Info: upload completely sent off: 15 out of 15 bytes
<= Recv header, 17 bytes (0x11)
0000: HTTP/1.1 200 OK
<= Recv header, 40 bytes (0x28)
0000: content-type: text/html; charset=utf-8
<= Recv header, 25 bytes (0x19)
0000: cache-control: no-cache
<= Recv header, 20 bytes (0x14)
0000: content-length: 11
<= Recv header, 23 bytes (0x17)
0000: vary: accept-encoding
<= Recv header, 37 bytes (0x25)
0000: Date: Sun, 05 Mar 2017 07:51:14 GMT
<= Recv header, 24 bytes (0x18)
0000: Connection: keep-alive
<= Recv header, 2 bytes (0x2)
0000:
<= Recv data, 11 bytes (0xb)
0000: hello world
== Info: Curl_http_done: called premature == 0
== Info: Connection #0 to host localhost left intact
hello world
服务器输出:
Server running at: http://localhost:8000
<Buffer 6e 61 6d 65 3d 6e 65 68 61 6c 6a 77 61 6e 69>
{ host: 'localhost:8000',
'user-agent': 'curl/7.51.0',
accept: '*/*',
'content-length': '15',
'content-type': 'application/x-www-form-urlencoded' }
要访问原始缓冲区,您必须将其移动到 route-prequisites。
所以路线的配置看起来像:
config: {
pre: [
{
method: (request, reply) => {
//signature verification steps
return reply.continue();
}
}
],
payload: {
output: 'data',
parse: false
}
}
我知道这个问题现在有点老了,但我最近遇到了同样的问题,我找到了一个不需要我放弃自动数据解析的解决方案。
在插件的 onRequest
挂钩中(您可以根据您感兴趣的请求直接执行此操作),我有以下代码:
server.ext('onRequest', (request, h) => {
const dataChunks: Buffer[] = [];
request.raw.req.on('data', (chunk) => {
dataChunks.push(chunk);
});
request.raw.req.on('end', () => {
request.plugins['MyPlugin'] = {
rawBody: Buffer.concat(dataChunks),
};
});
return h.continue;
});
稍后,在 preHandler
挂钩中,我可以访问原始缓冲区,但我认为 request.plugins['MyPlugin'].rawBody
属性.
用body-parser + expressjs就可以了。但我的问题是:如何在 Hapijs 中获取原始请求体的缓冲区?
我正在与之交谈的东西就像 body-parser npm 包的这个函数中的 buf
参数:verify(req,res, buf, encoding)
messenger-platform-samples 示例中的此函数需要它:
function verifyRequestSignature(req, res, buf) {
var signature = req.headers["x-hub-signature"];
if (!signature) {
console.error("Couldn't validate the signature.");
} else {
var elements = signature.split('=');
var method = elements[0];
var signatureHash = elements[1];
var expectedHash = crypto.createHmac('sha1', APP_SECRET)
.update(buf)
.digest('hex');
if (signatureHash != expectedHash) {
throw new Error("Couldn't validate the request signature.");
}
}
}
编辑:
我需要在使用 server.ext()
的中间件中使用它,如下所示:
server.ext({
type: 'onRequest',
method: (request, reply) => {
var signature = request.headers["x-hub-signature"];
if (!signature) {
console.error("Couldn't validate the signature.");
} else {
var elements = signature.split('=');
var method = elements[0];
var signatureHash = elements[1];
var expectedHash = crypto.createHmac('sha1', APP_SECRET)
.update(request.payload)
.digest('hex');
if (signatureHash != expectedHash) {
throw new Error("Couldn't validate the request signature.");
}
return reply.continue();
}
}
});
在hapi@16.1.0
中:
这是获取原始缓冲区和原始缓冲区的方法 headers:
'use strict';
const Hapi = require('hapi');
const server = new Hapi.Server();
server.connection({
host: 'localhost',
port: 8000
});
server.route({
method: 'POST',
path:'/',
handler: function (request, reply) {
console.log(request.payload);
console.log(request.raw.req.headers);
return reply('hello world');
},
config: {
payload: {
output: 'data',
parse: false
}
}
});
server.start((err) => {
if (err) throw err;
console.log('Server running at:', server.info.uri);
});
运行 示例:
$ curl -X POST 'http://localhost:8000/' -d name=nehaljwani --trace-ascii /dev/stdout
Note: Unnecessary use of -X or --request, POST is already inferred.
== Info: Trying 127.0.0.1...
== Info: TCP_NODELAY set
== Info: Connected to localhost (127.0.0.1) port 8000 (#0)
=> Send header, 148 bytes (0x94)
0000: POST / HTTP/1.1
0011: Host: localhost:8000
0027: User-Agent: curl/7.51.0
0040: Accept: */*
004d: Content-Length: 15
0061: Content-Type: application/x-www-form-urlencoded
0092:
=> Send data, 15 bytes (0xf)
0000: name=nehaljwani
== Info: upload completely sent off: 15 out of 15 bytes
<= Recv header, 17 bytes (0x11)
0000: HTTP/1.1 200 OK
<= Recv header, 40 bytes (0x28)
0000: content-type: text/html; charset=utf-8
<= Recv header, 25 bytes (0x19)
0000: cache-control: no-cache
<= Recv header, 20 bytes (0x14)
0000: content-length: 11
<= Recv header, 23 bytes (0x17)
0000: vary: accept-encoding
<= Recv header, 37 bytes (0x25)
0000: Date: Sun, 05 Mar 2017 07:51:14 GMT
<= Recv header, 24 bytes (0x18)
0000: Connection: keep-alive
<= Recv header, 2 bytes (0x2)
0000:
<= Recv data, 11 bytes (0xb)
0000: hello world
== Info: Curl_http_done: called premature == 0
== Info: Connection #0 to host localhost left intact
hello world
服务器输出:
Server running at: http://localhost:8000
<Buffer 6e 61 6d 65 3d 6e 65 68 61 6c 6a 77 61 6e 69>
{ host: 'localhost:8000',
'user-agent': 'curl/7.51.0',
accept: '*/*',
'content-length': '15',
'content-type': 'application/x-www-form-urlencoded' }
要访问原始缓冲区,您必须将其移动到 route-prequisites。 所以路线的配置看起来像:
config: {
pre: [
{
method: (request, reply) => {
//signature verification steps
return reply.continue();
}
}
],
payload: {
output: 'data',
parse: false
}
}
我知道这个问题现在有点老了,但我最近遇到了同样的问题,我找到了一个不需要我放弃自动数据解析的解决方案。
在插件的 onRequest
挂钩中(您可以根据您感兴趣的请求直接执行此操作),我有以下代码:
server.ext('onRequest', (request, h) => {
const dataChunks: Buffer[] = [];
request.raw.req.on('data', (chunk) => {
dataChunks.push(chunk);
});
request.raw.req.on('end', () => {
request.plugins['MyPlugin'] = {
rawBody: Buffer.concat(dataChunks),
};
});
return h.continue;
});
稍后,在 preHandler
挂钩中,我可以访问原始缓冲区,但我认为 request.plugins['MyPlugin'].rawBody
属性.