首页 > 解决方案 > Azure Bot 访问令牌重用,有可能吗?

问题描述

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

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

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

此致

标签: azureazure-web-app-servicebotframeworkazure-bot-servicedirect-line-botframework

解决方案


您只需要令牌来呈现网络聊天会话。因此,一旦网络聊天打开,您就不再需要令牌,并且您的对话可以持续超过 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 ANDresponse.text()我部署网络聊天的整个脚本都在异步函数中。


推荐阅读