首页 > 解决方案 > 从 HTML 文件中的 JavaScript 向 Bot Framework v4 的 Microsoft Web Chat 控件进行身份验证的正确方法是什么?

问题描述

我的目标是使用运行此 Microsoft Bot Framework v4 网络聊天控件的 JavaScript 创建一个 HTML 页面

https://github.com/Microsoft/BotFramework-WebChat

如此 StackOverflow 问题的评论中所述

自适应卡中的 Microsoft Bot Framework 图像大小

我试着按照这里的示例代码

https://github.com/compulim/BotFramework-MockBot

具体来说

BotFramework-WebChat-master\samples\01.a.getting-started-full-bundle

但无法让它工作。在上面链接的另一个问题中,微软支持人员告诉我以另一种方式进行身份验证:

您需要在标头中使用 Authorization: Bearer向https://directline.botframework.com/v3/directline/tokens/generate发出 POST 请求。或者,您可以直接使用 const token =

但是,在上面提到的示例代码中,它说

要与您的机器人交谈,您应该使用使用您的 Direct Line 密码交换的令牌。您永远不应该将 Direct Line 密码放在浏览器或客户端应用程序中。

如果上面建议的代码是包含在 HTML 文件中的 JavaScript,那么任何加载该页面的人都可以从查看源代码中看到它。

使用 DirectLine 秘密似乎违反了不公开此秘密的规则,我读过它可以提供对所有对话的访问,而不仅仅是当前对话。

如果普通视图中的 JS 代码使用 DirectLine secret 获取令牌,然后使用令牌进行身份验证,使用令牌似乎没有完成任何事情,因为 DL secret 被暴露了。为什么不直接使用 DL secret?

Microsoft 推荐的最简单的对上面链接的网络聊天控件进行身份验证的方法是什么?

谢谢!

标签: authenticationbotframeworkweb-chat

解决方案


为什么不直接使用 DL secret?

正如您所说,这将允许访问与机器人的所有对话。

如果普通视图中的 JS 代码使用 DirectLine secret 获取令牌,然后使用令牌进行身份验证,使用令牌似乎没有完成任何事情,因为 DL secret 被暴露了。

再更正。为了隐藏您的秘密,您需要设置自己的令牌服务器。我们没有关于如何设置它的官方、现成的示例,但是Web Chat 作者的这个示例应该可以帮助您入门。

如果你想自己写,流程基本上是:

  1. 让您的 WebChat 客户端向您的令牌服务器发送令牌请求
  2. 只要您不公开代码,您的令牌服务器就可以将秘密存储在变量中。让您的令牌服务器通过https://directline.botframework.com/v3/directline/tokens/generatePOST 请求和标头联系,Authorization: Bearer <YourSecret>
  3. 将该请求产生的令牌返回给 WebChat 客户端
    • 您的 WebChat 客户端现在将拥有一个令牌,而无需知道秘密,因为它使用了您的令牌服务器中间件

Microsoft 推荐的最简单的对上面链接的网络聊天控件进行身份验证的方法是什么?

不幸的是,没有一种方法既“简单”又“推荐”。最简单的就是直接使用你的秘密。如果您不关心用户对话是否会被公开,这很好。不过,推荐的方法是实现您自己的令牌服务器。


揭露秘密的补充阅读

这个 GitHub 问题

出于本次讨论的目的,我们将把秘密和令牌视为同一事物。如果您愿意,我们可以稍后再详细介绍。我现在将它们称为“秘密/令牌”。

要访问对话,您需要密钥/令牌和对话 ID。这些值有时粘在一起,有时位于单独的变量中。有时它们在 URL 中,有时它们存储在内存中的 JavaScript 中。这些类似于存储在用户 cookie 中的用户令牌。

在所有情况下,坐在自己计算机前的用户都可以访问这些值。他们可以读取自己的 URL,可以读取自己的 JavaScript 变量状态,还可以读取自己的 cookie。

如果他们将任何此类信息发送给其他人,则该人可以冒充他们。如果我的银行通过电子邮件向我发送了密码重置链接,并且我与其他人分享了该链接,则该人可以重置我的帐户密码并登录到我的帐户。

我们的 iFrame 使用 URL 来传递这些参数,因为在许多情况下这是足够的安全级别。(您是否曾经访问过一个网站,手动将 URL 提取到 iFrame,将其发送给其他人,并希望您的会话保持私密?可能不会。)

如果您想要额外的安全性,您可以跳过 iFrame 并在 JS 或 cookie 中发送您自己的密钥/令牌。您的 JS 可以提取它并将其发送到 Web Chat JS 对象。一旦网络聊天拥有秘密/令牌,就会专门使用 HTTP 授权标头将这些值发送到 Direct Line 服务。

所以,暴露你的秘密本身并不是什么问题。但是,它确实允许恶意用户冒充任何其他用户。

默认行为,因为 Directline 需要某种方式来确定与谁交谈是经过身份验证的。该密钥验证客户端(网络聊天)是否正常。但是什么可以验证用户是什么?用户名?但随后任何用户都可以设置自己的用户 ID 并冒充其他人。真正确保这一点的唯一方法是在您自己的一端实现一些东西,使用秘密来获取 Directline 令牌,然后将其传递回网络聊天客户端。

此外,为了获取对话数据,有人需要秘密对话 id。找出对话 ID 的可能性非常小。

不过一般来说,这种安全性只有在您尝试保留用户数据时才需要考虑。如果您的用户每次打开机器人时都会开始新的对话,您只需生成一个唯一的用户 ID,而不必担心密码是否泄露。

这是一篇关于在 C# 和 Node 中创建客户端控制器(令牌服务器)以及一些额外的安全功能/概念的好博文。.

这是关于其他安全注意事项和使用增强型 DirectLine 身份验证功能的另一篇博文


推荐阅读