Azure Bot 访问令牌重用,可能吗?
Azure Bot access token reuse, is it possible?
我已经开发了 azure bot 应用程序,我正在使用基于直线令牌的方法从我的 web 应用程序启动 azure chatbot。根据文档,令牌有效期为一小时,一小时后自动过期。令牌可以在到期前刷新。有两个问题。
我们观察到,即使在一个小时后聊天仍在继续,它仍然正常继续,没有任何影响。那么 1 小时到期意味着什么?是否需要为正在进行的对话刷新令牌?
同一个访问令牌可以被任何其他客户端重复使用吗?
此致
您只需要令牌来呈现网络聊天会话。因此,一旦网络聊天打开,您就不再需要令牌,您的对话可以毫无问题地进行超过 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的刷新在文档中没有提到
我已经开发了 azure bot 应用程序,我正在使用基于直线令牌的方法从我的 web 应用程序启动 azure chatbot。根据文档,令牌有效期为一小时,一小时后自动过期。令牌可以在到期前刷新。有两个问题。
我们观察到,即使在一个小时后聊天仍在继续,它仍然正常继续,没有任何影响。那么 1 小时到期意味着什么?是否需要为正在进行的对话刷新令牌?
同一个访问令牌可以被任何其他客户端重复使用吗?
此致
您只需要令牌来呈现网络聊天会话。因此,一旦网络聊天打开,您就不再需要令牌,您的对话可以毫无问题地进行超过 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的刷新在文档中没有提到