2

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

问题是 HangoutsAdapter 需要一个 google 令牌,当我转到 Hangouts Chat API 配置选项卡时,我选择了 Connection Settings 部分下的 Bot URL,但我唯一得到的是一个输入我的 bot 的 url 端点的字段。与我应该传递给环聊适配器的验证令牌无关。

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

4

2 回答 2

1

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

但是,另一种方法是使用 Bot Framework 的内置 OAuth 功能。我在我的机器人中使用它没有任何障碍。我确实导航到了 Google Hangouts 网站,它立即认出了我。通过使用 OAuth 登录,会返回一个令牌,您可以使用该令牌将其传递到环聊适配器。

我应该补充一点,下面的实现会产生一些人不喜欢的登录魔术代码(它不会打扰我)。可能有 SSO 选项,但我还没有研究过。


首先,您需要设置 Google 凭据,该凭据将为您提供“客户端 ID”和“客户端密码”。可以在此处找到一般说明。可以在此处创建凭据。您可以忽略任何编码参考,因为它们不是必需的(感谢 BF OAuth 功能)。

在凭证页面中,单击左侧菜单中的“凭证”。您需要配置两个区域,一旦出现:“OAuth 同意屏幕”和“凭据”。

在此处输入图像描述

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

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

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

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

在此处输入图像描述

在此处输入图像描述

最后,您需要从 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();
}

在此处输入图像描述

希望有帮助!

于 2019-06-29T03:55:44.483 回答
1

我在https://github.com/howdyai/botkit/issues/1722上创建了一个问题

基本上,环聊适配器需要一个令牌,以便将其与从环聊聊天 API 获得的令牌进行比较。但鉴于谷歌不再提供令牌,认证机制需要改变

于 2019-08-17T13:55:03.337 回答