从技术上讲,这是一种替代解决方案(我认为)。为了创建 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();
}
希望有帮助!