Node.js 如何将WebChat重新连接到具有过期令牌的旧会话

Node.js 如何将WebChat重新连接到具有过期令牌的旧会话,node.js,botframework,web-chat,Node.js,Botframework,Web Chat,如果我的令牌已过期,我想重新连接到WebChat中的旧bot对话,如果网络连接丢失或其他情况,可能会发生这种情况 我使用的WebChat基本上是这样的: directline = window.WebChat.createDirectLine({ token: token }); window.WebChat.renderWebChat({ directLine: directline }, document.getElementById('webchat')); 我用它生成的令牌 c

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

我使用的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'
});

createDirectLine
接受一个
conversationId
参数,因此我试图传递旧的会话id

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

使用新生成的相同用户标识的令牌。但是,
renderWebChat
由于令牌无效而失败,因为新令牌还获得了一个新的
conversationId
,该id与directLine调用中请求的id不匹配。我怎样才能解决这个问题?重新连接的方式完全不同,或者为给定的
用户ID
会话ID
生成新令牌。我在
v3/directline/token/generate
API中找不到任何东西来请求给定会话ID的令牌。

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

如果希望用户能够重新加入会话,则应在令牌过期之前通过调用
/directline/tokens/refresh
获取新的令牌来刷新令牌。然后必须保留令牌和conversationId,以便在中使用。这可以通过本地存储/会话存储或cookie来完成

在这个场景中,您将设置一个令牌服务器,以便在联系您自己的服务器端点时进行直连API调用。在令牌服务器上设置了刷新API后,Web聊天实例将调用刷新端点以获取新令牌。这可以在当前令牌到期前每25分钟执行一次。然后,新令牌应该被持久化

请记住,
localStorage
仅适用于页面刷新和浏览网页聊天。如果浏览器关闭,会话将丢失
sessionStorage
将在关闭的浏览器会话中保持,但如果不活动时间超过30分钟,则令牌将过期,因为无法打开Web聊天来刷新令牌。(如果用户离开的时间超过30分钟,本地存储也是如此。)

如果令牌过期,另一个选项是通过使用过期的
令牌
和相关的
会话ID
检索。你可以用上一个对话重新填充网络聊天记录,然后用一个新的对话继续,从用户的角度看,这个对话看起来是一样的。这不是最简单的方法,需要一些额外的逻辑才能正确,但在理论上是可行的

最后一个要考虑的问题,特别是上述问题,是会话ID只存储和访问14天,会话只存储和访问24小时。如果您需要长时间访问其中任何一个,那么您将需要一个存储解决方案来存储它们(Cosmos DB、SQL、Mongo等)


希望有帮助

接受/向上投票答案服务于更大的堆栈溢出社区和任何有类似问题的人。如果你觉得我的回答足够,请“接受”并投票表决。如果没有,让我知道我还能提供什么帮助!回答得很好。但是,您需要切换本地存储和会话存储。localStorage保持关闭的浏览器会话。会话存储没有。谢谢你的回答。我试图获取历史记录,但无法使用过期令牌(通过get/v3/directline/conversations/${conversationid})获取历史记录。使用过期令牌,我得到401响应,使用directline secret,我被要求提供用户id,使用WebChat secret,会话永远找不到。然后我发现:看来我运气不好?那么,如何在不做类似这样的大事的情况下查看聊天记录: