如何将数据从缓冲区转换为缓冲区?
How do I convert data from a buffer into a buffer?
我正在尝试编写一个单元测试来验证我的签名函数,该函数计算来自 webhook 的传入数据的签名。该函数按预期工作并正确计算签名。
签名码:
exports.checkSignature = (req) => {
let signatureComputed = this.computeSignatue(req.rawBody);
const signature = req.header('X-WC-Webhook-Signature');
return signature === signatureComputed;
};
exports.computeSignatue = (body) => {
return crypto.createHmac('SHA256', process.env.WEBHOOK_SECRET).update(body).digest('base64');
};
但是,当我尝试在玩笑中测试 computeSignature 函数时,我需要传递 'rawBody',它是我的 server.js 文件中定义的请求主体的缓冲区:
app.use(
express.json({
verify: (req, res, buf) => {
console.log(buf);
req.rawBody = buf;
},
})
);
当我记录提供给 computeSignature 的正文输入时,我得到以下信息:
{"type":"Buffer","data":[123,34,105,100,34,58,53,48,57,51,44,34,112,97,114,101,110,116,95,105,100,34,58,48,44,34,115,116,97,116,117,115,34,58,34,112,114,111,99,101,115,115,105,110,103,34,44,34,99,117,114,114,101,110,99,121,34,58,34,71,66,80,34,44,34,118,101,114,115,105,111,110...]}
我相信这是作为字符串传入的 JSON 对象的十进制表示。我需要采用这个十进制表示并将其转换为缓冲区以提供给我的 jest 函数:
describe('Security checks', () => {
it('should succeed signature checks', () => {
const result = helper.computeSignatue(MY_BUFFER);
expect(result).toEqual('SIGNATURE_HERE');
});
it('should fail signature checks', () => {
const result = helper.checkSignature(payloadData.badRequest);
expect(result).toEqual(false);
});
});
我认为主要问题是我无法模拟上面显示的使用 'verify' 函数的快速中间件。如果我可以模拟这个,我将能够通过我的 JSON 对象并以这种方式检索缓冲区。
以下相关文档说明了如何从字节的数组表示构造缓冲区:
https://nodejs.org/docs/latest-v14.x/api/buffer.html#buffer_static_method_buffer_from_array
如果您需要使用您 console.logged 的“真实”数据作为测试输入,这是可行的方法。或者,您可以从文件加载测试 JSON,例如使用 fs.readFile
或 fs.readFileSync
- 如果您没有指定编码,您将获得文件中字节的缓冲区。
我正在尝试编写一个单元测试来验证我的签名函数,该函数计算来自 webhook 的传入数据的签名。该函数按预期工作并正确计算签名。 签名码:
exports.checkSignature = (req) => {
let signatureComputed = this.computeSignatue(req.rawBody);
const signature = req.header('X-WC-Webhook-Signature');
return signature === signatureComputed;
};
exports.computeSignatue = (body) => {
return crypto.createHmac('SHA256', process.env.WEBHOOK_SECRET).update(body).digest('base64');
};
但是,当我尝试在玩笑中测试 computeSignature 函数时,我需要传递 'rawBody',它是我的 server.js 文件中定义的请求主体的缓冲区:
app.use(
express.json({
verify: (req, res, buf) => {
console.log(buf);
req.rawBody = buf;
},
})
);
当我记录提供给 computeSignature 的正文输入时,我得到以下信息:
{"type":"Buffer","data":[123,34,105,100,34,58,53,48,57,51,44,34,112,97,114,101,110,116,95,105,100,34,58,48,44,34,115,116,97,116,117,115,34,58,34,112,114,111,99,101,115,115,105,110,103,34,44,34,99,117,114,114,101,110,99,121,34,58,34,71,66,80,34,44,34,118,101,114,115,105,111,110...]}
我相信这是作为字符串传入的 JSON 对象的十进制表示。我需要采用这个十进制表示并将其转换为缓冲区以提供给我的 jest 函数:
describe('Security checks', () => {
it('should succeed signature checks', () => {
const result = helper.computeSignatue(MY_BUFFER);
expect(result).toEqual('SIGNATURE_HERE');
});
it('should fail signature checks', () => {
const result = helper.checkSignature(payloadData.badRequest);
expect(result).toEqual(false);
});
});
我认为主要问题是我无法模拟上面显示的使用 'verify' 函数的快速中间件。如果我可以模拟这个,我将能够通过我的 JSON 对象并以这种方式检索缓冲区。
以下相关文档说明了如何从字节的数组表示构造缓冲区: https://nodejs.org/docs/latest-v14.x/api/buffer.html#buffer_static_method_buffer_from_array
如果您需要使用您 console.logged 的“真实”数据作为测试输入,这是可行的方法。或者,您可以从文件加载测试 JSON,例如使用 fs.readFile
或 fs.readFileSync
- 如果您没有指定编码,您将获得文件中字节的缓冲区。