这是一类的故事,“如果没坏,就不要修理它”Node.js的HTTP流与Express.js请求对象请求
我创造了使用相对简单的HTTP请求处理程序Node.js的我对请求主体的SHA-1的匹配到是作为一个请求头签名验证请求:
var http = require('http');
var crypto = require('crypto');
var secret = process.env.MY_SECRET;
var requestListener = function(req, res) {
if (req.method === 'POST') {
var body = '';
req.on('data', function(data) {
body += data;
});
req.on('end', function() {
var signature = req.headers['x-signature'];
var hash = crypto.createHmac('sha1', secret)
.update(body)
.digest('hex')
.toUpperCase();
if (signature === hash) {
// request is authorized
}
});
}
};
var server = http.createServer(requestListener);
server.listen(3000);
这工作得很好,但一切都是丑陋的,到处都是Express.js我的其他功能反正要实施。我重写了代码如下:
var crypto = require('crypto');
var express = require('express');
var app = express();
var secret = process.env.MY_SECRET;
app.use(function(req, res, next) {
var signature = req.get('x-signature');
var hash = crypto.createHmac('sha1', secret)
.update(req.body)
.digest('hex')
.toUpperCase();
if (signature === hash) {
next();
} else {
// unauthorized
}
});
app.post('/', function(req, res) {
// request is authorized
});
app.listen(3000);
当然,加密方法将无法运行,因为req.body
现在既不是字符串或缓冲区。但我该如何解决这个问题?
我包括一些中间件:
app.use(bodyParser.json());
然后用JSON.stringify
将结果转换为字符串。这允许加密方法运行,但是散列和签名不匹配!
当使用中间件身体分析器时,Express是否可能对请求主体做其他事情?这对我没有任何意义,但也许我错过了一些东西。