gpt4 book ai didi

javascript - 请求正文中的 Facebook Messenger API 内容不完整

转载 作者:搜寻专家 更新时间:2023-11-01 00:17:00 25 4
gpt4 key购买 nike

解释有点长,请耐心等待。

我正在构建一个 Facebook Messenger 机器人,它在后端使用我的 sails.js/node.js 服务器和一个 MongoDB 数据库。

在我的 sails 应用程序中,我已将策略应用于 Controller 的方法,该方法处理在收到用户的文本后要执行的操作。在此策略中,我遵循文档(https://developers.facebook.com/docs/messenger-platform/webhook-reference -“安全”部分)并将请求 header 中的 x-hub-signature 与请求负载的 sha1 摘要进行比较(正文).

所以现在每当我向机器人发送消息时,它都会在策略中说来自请求的签名和我计算的签名不同,因此不会继续。我仔细检查了计算摘要时应该使用的应用程序 secret ,它似乎是正确的。我发现的另一个区别是,Facebook 请求还在其 header 中发送了一个“内容长度”字段,这与他们在同一请求中发送的正文的字符长度不同。这就是我认为不同签名的原因,但我无法解决它,也无法找到问题的根源,为什么会发生这种情况。

还需要注意的另一件事是,抛出此不匹配错误的同一代码在特定时间(实际上,大多数时间)运行完美。

所以有人可以帮我这个吗?我将永远感激 :)

这是策略中的代码

var crypto = require('crypto');
if(req.headers['x-hub-signature']){
//console.log('req headers -----', JSON.stringify(req.headers));
//console.log('req body -----', JSON.stringify(req.body));

var hmac, calculatedSignature, payload = req.body;
hmac = crypto.createHmac('sha1', app_secret);
hmac.update(JSON.stringify(payload));
calculatedSignature = 'sha1='+hmac.digest('hex');

//console.log("signature calculatedSignature",calculatedSignature);
if(calculatedSignature === req.headers['x-hub-signature']){
return next();
}else{
res.forbidden('You shall not pass!');
}
}

这是一个示例请求 header -

{"host":"e93d4245id.ngrok.io","accept":"*/*","accept-encoding":"deflate, gzip","content-type":"application/json","x-hub-signature":"sha1=d0cd8177add9b1ff367d411942603b0d08183964","content-length":"274","x-forwarded-proto":"https","x-forwarded-for":"127.0.0.1"}

这是同一个请求的正文 -

{"object":"page","entry":[{"id":"1778585282425767","time":1479476014038,"messaging":[{"sender":{"id":"userId"},"recipient":{"id":"recipientId"},"timestamp":1479468097895,"message":{"mid":"mid.1479468097895:efdc7d2c68","seq":2355,"text":"Hahahaha"}}]}]}

最佳答案

我认为问题在于需要将某些特定字符(例如 @ 和 %)转换为其文档中指定的 unicode 转义序列,并替换为原始字符串化 JSON。我转换了它们,然后计算了新字符串的 hmac 签名,它得到了匹配。

另外,我认为它在某些情况下起作用以及为什么不起作用的原因是因为正在字符串化的字符串中存在特殊字符。如果它没有字符 @ 或 % 那么它可以毫无问题地工作。

我就是这样解决的-在 if 中 var hmac, calculatedSignature, payload = JSON.stringify(req.body);

    var resStr = payload.replace(/\@|\%/g,function(a, i){
hex = payload.charCodeAt(i).toString(16);
var s = "\\u" + ("000"+hex).slice(-4);
return s;
});

hmac = crypto.createHmac('sha1', app_secret);
hmac.update(resStr);
calculatedSignature = 'sha1='+hmac.digest('hex');

if(calculatedSignature === req.headers['x-hub-signature']){
return next();
}else{
res.forbidden('You shall not pass!');
}

关于javascript - 请求正文中的 Facebook Messenger API 内容不完整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40678526/

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