微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用过期的令牌将WebChat重新连接到旧会话

如何解决如何使用过期的令牌将WebChat重新连接到旧会话

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

我基本上是这样使用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中找到任何东西来为给定的sessionId请求令牌。

解决方法

令牌与生成令牌的sessionId紧密相关。不幸的是,令牌过期后(1800秒/ 30分钟后)便无法刷新它,然后重新连接到代表原始令牌的会话。

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

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

请记住,localStorage仅适用于页面刷新以及浏览和返回Web聊天。如果关闭浏览器,会话将丢失。 sessionStorage将在关闭的浏览器会话中持续存在,但是如果闲置时间超过30分钟,则令牌将过期,因为Web聊天未打开以刷新令牌。 (如果用户导航超过30分钟,则对localStorage也可以这样说。)

如果令牌 已过期,则另一个选择是使用过期的token和关联的conversationId来检索conversation history。您可以使用先前的对话重新填充Web Chat的笔录,然后继续进行新对话,从用户的角度看,对话看起来是相同的。这不是最简单的方法,并且需要一些其他逻辑来正确处理,但是从理论上讲是可行的。

最后一个要考虑的因素,尤其是上述情况,是sessionId仅存储和访问14天,会话仅存储24小时。如果您需要较长时间访问其中任何一个,则需要一种存储解决方案来存储它们(Cosmos DB,SQL,Mongo等)。

希望有帮助!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。