从技术上讲,这是一种替代解决方案(我认为)。为了创建 Google Hangouts 凭据,需要一个 GSuite 帐户,而我没有。接口 HangoutsAdapterOptions docs 声明“已使用共享秘密令牌”进行验证,可在“配置”选项卡下找到。由于字段被锁定,我无法对此进行测试。
但是,另一种方法是使用 Bot Framework 的内置 OAuth 功能。我在我的机器人中使用它没有任何障碍。我确实导航到了 Google Hangouts 网站,它立即认出了我。通过使用 OAuth 登录,系统会返回一个令牌,您可以使用该令牌将其传递到环聊适配器。
我应该补充一点,下面的实现会产生一些人不喜欢的登录魔术代码(它不会打扰我)。可能有 SSO 选项,但我还没有研究过。
首先,您需要设置 Google 凭据,该凭据将为您提供“客户端 ID”和“客户端密码”。一般说明可以在here 找到。可以创建凭据here。您可以忽略任何编码参考,因为它们不是必需的(感谢 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
}));
此时,您的 bot 和登录过程应该 顺利进行。假设流程设置正确,用户应该能够使用魔术代码通过 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();
}
希望有帮助!