首页 > 解决方案 > 使用 Facebook 的 botBuilder 适配器获取传入请求的无效签名

问题描述

我已经成功地将这个示例repo部署到 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

我不确定我做错了什么

标签: node.jsbotframework

解决方案


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

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

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

希望有帮助!

- - -编辑 - - -

Facebook 适配器设计为独立于 Azure 机器人服务/ABS 通道工作,即使与 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 url,提供了验证令牌,并且没有使用模拟器,那么它应该可以无缝工作。

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


推荐阅读