gpt4 book ai didi

javascript - Node.js HTTP 流请求与 Express.js 请求对象

转载 作者:太空宇宙 更新时间:2023-11-04 02:24:33 26 4
gpt4 key购买 nike

这是一个“如果它没有坏,就不要修理它”的经典故事

我使用 Node.js 创建了一个相对简单的 HTTP 请求处理程序。我通过将请求正文的 SHA-1 与作为请求 header 提供的签名进行匹配来验证请求:

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将结果转换为字符串。这允许加密方法运行,但是,哈希和签名不匹配!

在使用像 body-parser 这样的中间件时,Express 是否可能对请求正文做其他事情?这对我来说没有任何意义,但也许我错过了一些东西。

最佳答案

带有正文解析器

var options = {
inflate: true,
limit: '100kb',
type: 'application/octet-stream'
};

app.use(bodyParser.raw(options));

然后就可以使用

app.post(routeName, (req, res) => {
let body = '';
req.on('data', (data) => {
body += data;
console.log(data)
});
req.on('end', () => {
fs.appendFile(`./${fileName}.log`, '\n' + body, (err) => {
if (err) throw err;
});
});
res.end();
})

关于javascript - Node.js HTTP 流请求与 Express.js 请求对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31329727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com