使用适用于 Facebook 的 botBuilder 适配器在传入请求上获取无效签名



我已经成功地将此示例存储库部署到Azure,它现在可以在网络聊天和Slack上运行。

现在我正在尝试在我的机器人中使用 facebook 适配器。我已经按照说明将FacebookAdapter与BotBuilder一起使用,并将以下代码添加到index.js

const { FacebookAdapter } = require('botbuilder-adapter-facebook');
const restify = require('restify');
const adapter = new FacebookAdapter({
verify_token: process.env.FACEBOOK_VERIFY_TOKEN,
app_secret: process.env.FACEBOOK_APP_SECRET,
access_token: process.env.FACEBOOK_ACCESS_TOKEN
});
const server = restify.createServer();
server.use(restify.plugins.bodyParser());
server.use(restify.plugins.queryParser());
server.get('/api/messages', (req, res) => {
if (req.query['hub.mode'] === 'subscribe') {
if (req.query['hub.verify_token'] === process.env.FACEBOOK_VERIFY_TOKEN) {
const val = req.query['hub.challenge'];
res.sendRaw(200, val);
} else {
console.log('failed to verify endpoint');
res.send('OK');
}
}
});
server.post('/api/messages', (req, res) => {
adapter.processActivity(req, res, async(context) => {
await context.sendActivity('I heard a message!');
});
});
server.listen(process.env.port || process.env.PORT || 3000, () => {
console.log(`n${ server.name } listening to ${ server.url }`);
});

在我的 .env 文件中,我也添加了所需的各种令牌和机密。

当我尝试使用机器人框架模拟器在本地测试应用程序时,出现错误

(node:11588) UnhandledPromiseRejectionWarning: Error: Invalid signature on incoming request
at FacebookAdapter.<anonymous> (/home/ronald/Desktop/03.welcome-users/node_modules/botbuilder-adapter-facebook/lib/facebook_adapter.js:421:23)
at Generator.next (<anonymous>)
at /home/ronald/Desktop/03.welcome-users/node_modules/botbuilder-adapter-facebook/lib/facebook_adapter.js:15:71

我不确定我做错了什么

不幸的是,这似乎是一个各种各样的错误。Botkit Github 存储库中已存在问题,各种客户遇到类似问题,但目前没有修复程序。它似乎不会影响所有客户,因为 Botkit 开发人员(在他发布时(能够毫无错误地使用该适配器。

在调查您的问题时,我能够确定错误是由FacebookAdapter类中的verifySignature()方法生成的。应该有一个从Facebook返回的"x-hub-signature"标头,用于检查webhook事件的请求有效负载的签名。由于未知原因,缺少此标头,从而导致"无效签名"消息。

我建议您对上述GH问题发表评论,以帮助促进该问题的工作。

希望有帮助!

-----编辑-----

Facebook 适配器设计为独立于 Azure Bot Service/ABS Channels,即使与 BotFramework 机器人集成也是如此。因此,它不适用于BotFramework Emulator。它旨在直接连接到机器人的适配器。

这也意味着您需要在 Facebook 应用设置中调整 Webhook 回调 URL,以指向本地运行的机器人。为 ABS 配置时,Webhook 值如下所示:

https://facebook.botframework.com/api/v1/bots/[botname].

您需要调整它以指向您的 ngrok 终结点(用于在本地机器人和外部源(如 Facebook(之间建立隧道(。新的 webhook 值如下所示:

https://1a04e4ad.ngrok.io/api/messages.

不要忘记包括也来自Facebook的验证令牌(可在设置中找到(。

假设您已经更改了 webhook 网址,提供了验证令牌,并且没有使用模拟器,那么它应该可以无缝工作。

注意:Facebook 会为通过的每个事件发送回声和交付确认。结果是,如果您不筛选传入的事件类型或关闭 Facebook 中的其他事件,那么您的机器人将不断受到攻击。

最新更新