我正在编写一个自定义中间件,它为每个请求生成加密签名(它与AWS API v4使用的身份验证机制非常相似).为了正确生成此签名,我必须获取HTTP请求的整个原始主体.
我也在使用BodyParser,它是在我的自定义中间件之后注册的.
我的自定义中间件可以表示如下:
// libs/simplifiedSignatureCheckerMiddleware.js
module.exports = function (req, res, next){
// simple and fast hashing stuff
var payload = '';
req.on('data', function(chunk) { payload += chunk }, null);
req.on('end', function(){
// hmac stuff
console.log(payload);
var ok = true; // ...
if(ok)
next();
else
next("Bad")
});
}
Run Code Online (Sandbox Code Playgroud)
这就是我在服务器上使用它的方式.
// simpleServer.js
// BASE SETUP
// =============================================================================
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var jsonStream = require('express-jsonstream');
var nconf = require('nconf');
var https = require('https');
var fs = require('fs');
// load configurations
nconf.argv().env();
nconf.file({file: 'config.json'});
app.use(require('./libs/simplifiedSignatureCheckerMiddleware'));
// configure app to use bodyParser()
// this will let us get the data from a POST
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(jsonStream());
// ROUTES FOR API
// =============================================================================
var router = express.Router();
router.post('/api/', function (req, res) {
var param1 = req.body.param1 || "";
var param2 = req.body.param2 || "";
res.json({message: 'welcome', one: param1, two: param2 });
});
// REGISTER ROUTES
app.use(router);
// START THE SERVER
// =============================================================================
https.createServer({
key: fs.readFileSync('./key.pem'),
cert: fs.readFileSync('./cert.pem')
}, app).listen(nconf.get('http:port'));
console.log("APIs listening on port " + nconf.get('http:port'));
Run Code Online (Sandbox Code Playgroud)
您可以验证,中间件将原始主体成功写入控制台,但请求永远不会被注册的路由处理,连接将永久挂起.
你对如何解决这个问题有任何线索吗?
提前致谢.
Ema*_*dio 26
好吧,因为解决这个问题的唯一可行方法似乎是通过修改bodyParser的原始源代码,我已经分叉了.
https://github.com/emanuelecasadio/body-parser-rawbody
此fork将请求的原始主体公开为名为rawBody的字段.如您所见,只有一行额外的代码.
您可以使用安装它npm install body-parser-rawbody
.
编辑
另一种选择是使用像这样的bodyParser,如dougwilson所述:https://github.com/expressjs/body-parser/issues/83#issuecomment-80784100
app.use(bodyParser.json({verify:function(req,res,buf){req.rawBody=buf}}))
Run Code Online (Sandbox Code Playgroud)
我没有亲自尝试过此选项,我不知道它是否有效.
归档时间: |
|
查看次数: |
5402 次 |
最近记录: |