Azure Bot 访问令牌重用,是否可能?

问题描述

我开发了 azure bot 应用程序,我使用基于直线令牌的方法从我的 Web 应用程序启动 azure 聊天机器人。根据文档,令牌有效期为一小时,一小时后自动过期。令牌可以在过期前刷新。有两个问题。

  1. 我们观察到,即使在一小时后聊天仍在进行,它仍然正常进行而没有任何影响。那么 1 小时到期是什么意思呢?是否需要为正在进行的对话刷新令牌?

  2. 相同的访问令牌可以被任何其他客户端重复使用吗?

最好的问候

解决方法

您只需要用于呈现网络聊天会话的令牌。因此,一旦网络聊天打开,您就不再需要令牌,并且您的对话可以持续超过 1 小时而不会出现问题。我想你可以在一小时内重复使用令牌来开始一个新的网络聊天会话,或者刷新它以在此之后使用它,但是当你可以生成另一个令牌时,这似乎没有必要。此外,您几乎肯定希望在令牌请求的正文中传递 User 属性,以便您可以存储(并正确检索)来自用户状态的信息。显然,在这种情况下,您不希望将此令牌用于其他客户端。我想如果你不在你的机器人中使用用户状态,你可以重用它,但我不会推荐它,我再次认为这样会更有效。

我假设您已经拥有了一些这样的集合,但这里是我创建端点以在我的机器人中创建令牌的方法:

server.post('/directline/token',async (req,res) => {

    try {
        var body = {User:{Id:req.body.userId}};
        const response = await request({
            url: 'https://directline.botframework.com/v3/directline/tokens/generate',method: 'POST',headers: { Authorization: `Bearer ${process.env.DIRECTLINE_SECRET}`},json: body,rejectUnauthorized: false,timeout: 10000
        });
        const token = response.token;
        res.setHeader('Content-Type','text/plain');
        res.writeHead(200);
        res.write(token);
        res.end();
    } catch(err) {
        console.log(err);
        res.setHeader('Content-Type','text/plain');
        res.writeHead(500);
        res.write('Call to retrieve token from Direct Line failed');
        res.end();
    }
})

我正在从我的网页发送 userId,我在下面显示。无论在何处部署机器人,您都需要从脚本中访问此端点(假设您使用的是 botframework-webchat CDN)。这是我使用的代码。

    const response = await fetch('https://YOURAPPSERVICE.azurewebsites.net/directline/token',{
        method: 'POST',headers: {'Content-Type':'application/json'},body: JSON.stringify({userId:userID})
    });
    const token = await response.text();

请求正文必须是字符串化的 JSON。用户 ID 只是网页在呈现机器人之前检索和/或设置的 cookie。 Fetch 将响应作为流返回,因此您需要使用 .text().json() 转换它,具体取决于您从机器人端点发送响应的方式(我使用了 .text() ,如果你想使用 JSON,你需要设置你的令牌端点来返回它而不是像我上面那样的文本)。您需要同时等待 fetch AND response.text()。我部署网络聊天的整个脚本都在一个异步函数中。

,

感谢比尔的详细回复。它也工作正常。在我们的例子中,我们使用 window.WebChat.renderWebChat。您可以在通话中传递您的令牌。它在内部每 15 分钟刷新一次令牌。请参阅 GitHub 文档以获取相同信息。令牌每 15 分钟刷新一次,因此如果聊天超过 15 分钟,令牌就不会过期。文档中未提及此令牌刷新。