【问题标题】:How to reconnect WebChat to old conversation with an expired token如何使用过期令牌将 WebChat 重新连接到旧对话
【发布时间】:2020-09-07 17:40:58
【问题描述】:

如果我的令牌已过期,我想重新连接到 WebChat 中的旧机器人对话,如果网络连接丢失或其他情况可能会发生这种情况。

我基本上是这样使用网络聊天的:

directline = window.WebChat.createDirectLine({ token: token });

window.WebChat.renderWebChat({
   directLine: directline
}, document.getElementById('webchat'));

我生成的令牌

cres = await fetch('https://directline.botframework.com/v3/directline/tokens/generate', {
   body: JSON.stringify({ User: { Id: userID }, TrustedOrigins: [origin] }),
   headers: {
      authorization: `Bearer ${process.env.DIRECT_LINE_SECRET}`,
      'Content-Type': 'application/json'
   },
   method: 'POST'
});

根据https://github.com/microsoft/BotFramework-WebChat/blob/master/docs/API.md

createDirectLine 采用 conversationId 参数,所以我尝试传递旧的对话 ID

directline = window.WebChat.createDirectLine({ token: token, conversationId: oldConvId });

为同一用户 ID 新生成的令牌。但随后renderWebChat 因令牌无效而失败,因为新令牌还获得了一个新的conversationId,它与directLine 调用中请求的不匹配。我怎么解决这个问题?要么以完全不同的方式重新连接,要么为给定的userIdconversationId 生成一个新令牌。我在 v3/directline/token/generate API 中找不到任何东西来为给定的 conversationId 请求令牌。

【问题讨论】:

  • 接受/赞成一个答案服务于更大的 Stack Overflow 社区和任何有类似问题的人。如果您觉得我的回答足够,请“接受”并点赞。如果没有,请告诉我我还能提供哪些帮助!

标签: node.js botframework web-chat


【解决方案1】:

令牌与生成它们的会话 ID 密切相关。不幸的是,一旦令牌过期(1800 秒/30 分钟后),就没有选项可以刷新它,然后重新连接到原始令牌所代表的对话。

如果您希望用户能够重新加入对话,则应在令牌过期之前通过调用refresh API /directline/tokens/refresh 来刷新令牌以获取新令牌。然后,您必须保留令牌和 conversationId 以在 reconnecting 中使用。这可以通过 localStorage/sessionStorage 或 cookie 来完成。

在这种情况下,您将设置一个令牌服务器,以便在联系您自己的服务器端点时进行 Direct Line API 调用。在令牌服务器上设置刷新 API 后,您的网络聊天实例将调用刷新端点以获取新令牌。这可以在当前令牌到期前每 25 分钟完成一次。然后应该保留新令牌。

请记住,localStorage 仅适用于页面刷新和导航离开和返回网络聊天。如果浏览器关闭,会话将丢失。 sessionStorage 将在关闭的浏览器会话中持续存在,但如果不活动时间超过 30 分钟,则令牌将过期,因为网络聊天未打开以刷新令牌。 (如果用户离开的时间超过 30 分钟,localStorage 也是如此。)

如果令牌 过期,另一种选择是使用过期的token 和关联的conversationId 检索conversation history。您可以使用以前的对话重新填充 Web Chat 的脚本,并使用从用户的角度来看看起来相同的新对话继续它。这不是最简单的方法,需要一些额外的逻辑才能正确,但理论上是可行的。

最后一个考虑因素,尤其是上述考虑因素,conversationId 仅存储和访问 14 天,对话 24 小时。如果您需要更长时间地访问其中任何一个,那么您将需要一个存储解决方案来将它们存储在(Cosmos DB、SQL、Mongo 等)中。

希望有帮助!

【讨论】:

  • 很好的答案。但是,您需要切换本地和会话存储。 localStorage 保持关闭的浏览器会话。 sessionStorage 没有。
  • 感谢您的回答。我试图获取历史记录,但无法使用过期令牌(通过 GET /v3/directline/conversations/${conversationid})使用过期令牌我收到 401 响应,使用我被问到的直达密码提供用户 ID,并使用 WebChat 秘密,永远找不到对话。然后我发现了这个:github.com/microsoft/BotFramework-DirectLineJS/issues/… 所以看来我运气不好?那么如何在不做这样的大事的情况下获取聊天记录:github.com/EricDahlvang/BotFramework-WebChat/pull/1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 2022-07-20
  • 2019-02-22
  • 2019-04-07
  • 2020-11-11
相关资源
最近更新 更多