如何在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');
}
发布于 2020-08-21 18:17:21
您只需要主体(有效负载),不需要其他任何东西。我不会尝试解析xml。不是js的人,我想下面的链接描述了在nodejs How to process POST data in Node.js?中获取主体的方法。
发布于 2020-08-21 22:23:28
你想要原始的帖子主体。Express通常提供流,因此一种技术是将正文流的各个部分逐段添加到散列中。
看起来像是有一个body-parser#raw,您可以将其设置为Express中间件,它将为您提供作为单个内容块的主体。
请注意,它的一个选项是最大正文长度。如果您在Connect通知中包含信封的文档,则大小很容易达到20MB或更大。
...and这就是为什么它是而不是建议您在webhook (连接)通知中包含信封的文档。相反,使用通知作为触发器,然后下载文档。
另外,我强烈建议您使用PaaS队列系统来对通知消息进行排队。请参阅blog post和代码示例。
发布于 2020-09-04 17:38:58
我找到了一个解决方案。
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, res, next) {
try {
return DocsController.webhook(req, res);
} catch (e) {
console.log(e);
return res.status(500).send('Internal error');
}
});
https://stackoverflow.com/questions/63519189
复制相似问题