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

Azure Bot access token reuse, is it possible?

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

  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。 userID 只是网页检索 and/or 在呈现机器人之前设置的 cookie。 Fetch return 将响应作为流,因此您需要使用 .text().json() 将其转换,具体取决于您从机器人端点发送响应的方式(我使用.text(),如果你想使用 JSON,你需要将你的令牌端点设置为 return,而不是像我上面那样设置文本)。您需要同时等待 fetch response.text()。我部署网络聊天的整个脚本都在一个异步函数中。

感谢比尔的详细回复。它也可以正常工作。在我们的例子中,我们使用 window.WebChat.renderWebChat。您可以在通话中传递您的令牌。在内部,它每 15 分钟刷新一次令牌。请参考 GitHub 文档。令牌每 15 分钟刷新一次,因此如果聊天时间超过 15 分钟,令牌就不会过期。这个token的刷新在文档中没有提到