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

2023-12-09

我的目标是使用 JavaScript 创建一个运行此 Microsoft Bot Framework v4 Web Chat Control 的 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

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

您需要向https://directline.botframework.com/v3/directline/tokens/generatewith Authorization: 标头中的 Bearer。或者,您可以直接使用 const token = 来代替

然而,在上面提到的示例代码中,它说

要与您的机器人交谈,您应该使用通过 Direct Line 密钥交换的令牌。 您切勿将 Direct Line 机密放入浏览器或客户端应用程序中。

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

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

如果普通视图中的 JS 代码使用 DirectLine 机密来获取令牌,然后使用该令牌进行身份验证,则使用令牌似乎无法完成任何操作,因为 DL 机密已暴露。为什么不直接使用 DL 秘密呢?

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

Thanks!


为什么不直接使用 DL 秘密呢?

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

如果普通视图中的 JS 代码使用 DirectLine 机密来获取令牌,然后使用该令牌进行身份验证,则使用令牌似乎无法完成任何操作,因为 DL 机密已暴露。

再次正确。为了隐藏您的秘密,您需要设置自己的令牌服务器。我们没有关于如何设置的官方现成示例,但是此示例由网络聊天作者提供应该可以帮助你开始。

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

  1. 让您的 WebChat 客户端向您的令牌服务器发送令牌请求
  2. 只要您不公开代码,您的令牌服务器就可以将秘密存储在变量中。让您的令牌服务器联系https://directline.botframework.com/v3/directline/tokens/generate使用 POST 请求和标头,Authorization: Bearer <YourSecret>
  3. Return the token that results from that request back to the WebChat client
    • 您的 WebChat 客户端现在将拥有一个令牌,而无需知道秘密,因为它使用了您的令牌服务器中间件

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

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


关于揭露秘密的补充阅读

From 这个 GitHub 问题

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

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

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

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

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

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

所以,让你的秘密暴露并不是一个big deal, per se。但是,它确实允许恶意用户冒充任何其他用户。

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

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 HTML 文件中的 JavaScript 向 Bot Framework v4 的 Microsoft Web Chat 控件进行身份验证的正确方法是什么? 的相关文章

随机推荐