如何解决检查HMAC签名
如何在express.js
应用程序中从POST正文创建正确的签名?
我不知道应该发送什么,而不是官方文档中的有效载荷。我试图以不同的方式传递req.body
,但没有成功。在适当的控制器之前,有一堆中间件(尤其是body-parser-xml
)。
function ComputeHash (secret,payload)
{
var crypto = require('crypto');
var hmac = crypto.createHmac('sha256',secret);
hmac.write(payload);
hmac.end();
return hmac.read().toString('base64');
}
解决方法
您只需要身体(有效载荷),就不需要别的了。我不会尝试解析xml。 不是JS家伙,而是我认为的波纹管链接描述了在Node.js中获取主体的方法 How to process POST data in Node.js?
,您需要原始POST正文。 Express通常会传递流,因此一种技术是将主体流的各个部分逐个添加到哈希中。
您似乎可以将body-parser#raw设置为Express中间件,从而将主体作为单个内容块。
请注意,其选项之一是最大车身长度。如果将信封的文档包括在“连接”通知中,则大小可以轻松达到20MB或更多。
...这就是为什么不建议您在Webhook(连接)通知中包括信封的文档。而是使用通知作为触发条件,然后下载文档。
此外,我强烈建议您使用PaaS排队系统对通知消息进行排队。请参见blog post和代码示例。
,我找到了解决方法。
const rawBodySaver = function (req,res,buf,encoding) {
if (buf && buf.length) {
req.rawBody = buf.toString(encoding || 'utf8');
}
}
router.post('/webhook',bodyParser.xml({
limit: '2MB',extended: true,verify: rawBodySaver,type: '*/*',xmlParseOptions: {
normalize: false,// Trim whitespace inside text nodes
normalizeTags: true,// Transform tags to lowercase
explicitArray: false // Only put nodes in array if >1
},}),async function(req,next) {
try {
return DocsController.webhook(req,res);
} catch (e) {
console.log(e);
return res.status(500).send('Internal error');
}
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。