如何将BotFramework与环聊聊天集成

时间:2019-06-24 19:02:19

标签: botframework botkit hangouts-chat

我也正在尝试将我的机器人也集成到环聊聊天API中。我从C#迁移到node.js,以便能够使用HangoutsAdapter:https://botkit.ai/docs/v4/platforms/hangouts.html

问题在于,HangoutsAdapter需要一个Google令牌,当我转到“ Hangouts Chat API配置”标签时,我在“连接设置”部分下选择了Bot URL,但我得到的唯一是输入机器人的url端点的字段。我不应该将验证令牌传递给环聊适配器。

还有其他方法可以通过HangoutsAdapter验证与该API的连接吗?我应该使用其他东西而不是HangoutsAdapter吗?还是我应该以其他方式使用它?

2 个答案:

答案 0 :(得分:0)

从技术上讲,这是一种替代解决方案(我认为)。为了创建Google Hangouts凭据,我需要一个GSuite帐户,而我没有。接口HangoutsAdapterOptions docs声明“已使用共享秘密令牌”用于验证,位于“配置”选项卡下。由于字段被锁定,我无法对此进行测试。

但是,替代方法是使用Bot Framework的内置OAuth功能。我在机器人中毫无障碍地使用了它。我没有导航到Google环聊网站,它立即认出了我。通过使用OAuth登录名,将返回令牌,您可以使用令牌将其传递到环聊适配器中。

我应该补充一点,以下实现产生了一些人不喜欢的登录魔术代码(这并不打扰我)。可能有一个SSO选项,但是我还没有对此进行研究。


首先,您需要设置Google凭据,该凭据将为您提供“客户端ID”和“客户端密码”。常规说明可以在here中找到。可以创建凭证here。您可以忽略任何不必要的编码引用(由于BF OAuth功能)。

从“凭据”页面中,单击左侧菜单中的“凭据”。您需要配置两个区域,分别位于其中:“ OAuth同意屏幕”和“凭据”。

enter image description here

对于OAuth同意屏幕,请提供应用名称。这不需要与关联的请求应用程序匹配,仅在访问“凭据”页面时提供参考。输入支持电子邮件,您将使用的范围(电子邮件,个人资料和openid)。可能还有其他必需的范围,但这在我访问环聊网站时对我有用。最后,输入授权域。 botframework.com域是必需的。其他(如果有),您将不得不尝试。保存并返回到“凭据”页面。

单击“创建凭据”按钮,然后填写表格。给您的凭据命名(同样,在此项目的其他任何地方都没有引用),输入任何授权的来源,然后输入https://token.botframework.com/.auth/web/redirect作为授权的重定向URI。保存设置,将“客户端ID”和“客户端机密”复制到某处,然后导航到Azure并进入机器人的设置页。

在这里,您需要创建机器人的OAuth连接。这是在“设置”刀片中完成的。刀片服务器底部是“ OAuth连接设置”部分。点击“添加设置”按钮开始使用。

输入一次后,为您的连接命名。下一步,您的漫游器会引用该名称,因此请将其保存在某处。然后,从服务提供商列表中选择Google,然后将您之前保存的“客户端ID”和“客户端密码”粘贴到相应的字段中。在“合并范围”中,您将要输入在Google凭据应用中选择的相同合并范围值(“电子邮件配置文件openid”)。输入它们时,请确保它们之间用空格隔开。

enter image description here

enter image description here

最后,您将需要根据Botbuilder-Samples存储库中的示例18.bot-authentication对OAuth登录进行建模。这建立了使用户能够通过您的机器人登录所需的功能。

将您分配给机器人的Google连接设置的连接名称作为变量添加到.env文件中,例如:connectionName=<CONNECTION_NAME>

设置OAuth提示时,您将在以下位置传递此变量:

this.addDialog(new OAuthPrompt(OAUTH_PROMPT, {
  connectionName: process.env.connectionName,
  text: 'Please Sign In',
  title: 'Sign In',
  timeout: 300000
}));

在这一点上,您的机器人程序和登录过程应该很好。假设流程设置正确,则用户应该能够使用魔术代码通过OAuth提示符登录。令牌将返回给机器人,下一步可以通过context进行访问。然后可以将令牌保存到状态并传递给适配器以供使用。下面,我使用一个简单的瀑布,该瀑布带有一个oauthPrompt步骤和一个loginResults步骤。令牌是在我对其进行控制台登录的第二步中捕获的。

async oauthPrompt(step) {
    return await step.prompt(OAUTH_PROMPT, {
        prompt: {
            inputHint: 'ExpectingInput'
        }
    });
}

async loginResults(step) {
  let tokenResponse = step.result;
  console.log('TOKEN: ', tokenResponse);

  if (tokenResponse != null) {
    await step.context.sendActivity('You are now logged in.');
    return await step.prompt(CONFIRM_PROMPT, 'Do you want to view your token?', ['yes', 'no']);
  }

  // Something went wrong, inform the user they were not logged in
  await step.context.sendActivity('Login was not successful please try again');
  return await step.endDialog();
}

enter image description here

希望有帮助!

答案 1 :(得分:0)

我在https://github.com/howdyai/botkit/issues/1722

上创建了一个问题

基本上,视频群聊适配器需要令牌,以便将其与从视频群聊聊天api获得的令牌进行比较。但是鉴于Google不再提供令牌,因此身份验证机制需要更改