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

时间:2019-05-27 19:26:05

标签: authentication botframework web-chat

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

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

如有关此StackOverflow问题的评论中所述

Microsoft Bot Framework image size in adaptive card

我尝试在此处遵循示例代码

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

具体

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

但无法正常工作。在上面链接的另一个问题中,Microsoft支持人员告诉我要进行另一种身份验证:

  

您需要向https://directline.botframework.com/v3/directline/tokens/generate发送POST请求,并在标题中添加Authorization:Bearer。另外,您也可以直接使用const token =,

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

  

要与您的机器人对话,您应该使用通过Direct Line机密交换的令牌。   绝对不要在浏览器或客户端应用程序中放置“直接线路”密码。

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

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

如果在纯视图中的JS代码使用DirectLine机密获取令牌,然后使用令牌进行身份验证,则由于公开了DL机密,因此使用令牌似乎无济于事。为什么不只使用DL机密?

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

谢谢!

1 个答案:

答案 0 :(得分:1)

  

为什么不仅仅使用DL机密?

正如您所说,这将允许访问与该漫游器的所有对话。

  

如果普通视图中的JS代码使用DirectLine机密获取令牌,然后使用令牌进行身份验证,则由于公开了DL机密,因此使用令牌似乎无济于事。

再次更正。为了隐藏秘密,您需要设置自己的令牌服务器。我们没有关于如何进行设置的正式的随时可用的示例,但是this sample by the Web Chat author应该可以帮助您入门。

如果要编写自己的内容,流程基本上是:

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

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

不幸的是,没有一种方法既是“简单的”又是“推荐的”。最简单的就是直接使用您的秘密。如果您不在乎可以公开用户对话,那很好。但是,推荐的方法是实现自己的令牌服务器。


关于揭秘的其他阅读内容

来自this GitHub issue

  

出于讨论的目的,我们将机密和令牌视为同一件事。如果需要的话,我们稍后会详细介绍。我现在将它们称为“秘密/令牌”。

     

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

     

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

     

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

     

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

     

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

因此,公开您的秘密并不是交易,本身。但是,它确实允许邪恶的用户冒充其他任何用户。

这是 的默认行为,因为Directline需要某种方式来确定与之进行身份验证的对象。机密会验证客户端(网络聊天)是否正常。但是,什么可以证明用户是?用户ID?但是,任何用户都可以设置自己的用户ID并假冒其他人。真正确保这一点唯一安全的方法是在您自己的端上实现一些使用该秘密的事物来获取Directline令牌,然后将其传递回Web聊天客户端。

另外,要获取对话数据,有人将需要秘密的对话ID。找出对话ID的可能性很小。

尽管如此,通常来说,只有在尝试保留用户数据时,才需要考虑此安全性。如果您的用户每次打开漫游器都会开始新的对话,则只需生成一个唯一的用户ID,就不必担心机密是否已公开。

Here's a good blog post regarding creating a Client Controller (token server) in C# and Node as well as some additional security features/concepts.

Here's another blog post on additional security considerations and using Enhanced DirectLine Authentication Features