如何将 BotFramework 与 Hangouts Chat 集成

How to integrate BotFramework with Hangouts Chat

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

问题是 HangoutsAdapter 需要一个 google 令牌,当我转到 Hangouts Chat API 配置选项卡时,我在连接设置下 select Bot URL部分,但我唯一得到的是一个字段,用于输入我的机器人的 url 端点。我应该传递给环聊适配器的验证令牌没有任何内容。

是否有任何其他方法可以通过 HangoutsAdapter 验证与 API 的连接?我应该使用其他东西而不是 HangoutsAdapter 吗?或者也许我应该以不同的方式使用它?

从技术上讲,这是一个替代解决方案(我认为)。为了创建 Google 环聊凭据,需要一个 GSuite 帐户,但我没有。界面 HangoutsAdapterOptions docs 声明 "Shared secret token [is] used" 进行验证,可在“配置”选项卡下找到。由于字段被锁定,我无法对此进行测试。

但是,替代方法是使用 Bot Framework 的 built-in OAuth 功能。我在我的机器人中使用它很顺利。我做了 导航到 Google 环聊网站,它立即认出了我。通过使用 OAuth 登录,returned 令牌可用于传递到 Hangouts 适配器。

我应该补充一点,下面的实现产生了一些人不喜欢的 sign-in 魔法代码(我不介意)。可能有一个 SSO 选项,但我没有研究过。


首先,您需要设置 Google 凭据,这将为您提供 "Client id" 和 "Client secret"。可以找到一般说明 here. Credentials can be created here。您可以忽略任何编码参考,因为它们不是必需的(感谢 BF OAuth 功能)。

在凭据页面中,单击左侧菜单中的 "Credentials"。有两个区域需要配置:"OAuth consent screen" 和 "Credentials".

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

单击 "Create Credentials" 按钮并填写表格。为您的凭据命名(同样,未在该项目的任何其他地方引用),输入任何授权来源,然后输入 https://token.botframework.com/.auth/web/redirect 作为授权重定向 URI。保存设置,将 "Client id" 和 "Client secret" 复制到某处,然后导航到 Azure 并进入机器人的设置页面。

在这里,您需要创建机器人的 OAuth 连接。这是在设置 blade 中完成的。 blade 的底部是 "OAuth Connection Settings" 部分。单击 "Add Setting" 按钮开始。

进入后,为您的连接命名。该名称将在下一步中由您的机器人引用,因此请将该名称保存在某处。然后,从服务提供商列表中选择 select Google,并将您之前保存的 "Client id" 和 "Client secret" 粘贴到相应的字段中。在 "Scopes" 中,您需要输入与 select 在 Google 凭据应用程序 ("email profile openid") 中编辑的相同范围值。输入时请确保它们是 space-separated。

最后,您需要根据 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 提示登录。一个令牌被 return 发送回机器人,在下一步中可以通过 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();
}

希望得到帮助!

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

上创建了一个问题

基本上环聊适配器需要一个令牌,以便将其与从环聊聊天 api 获得的令牌进行比较。但鉴于 google 不再提供令牌,身份验证机制需要更改