有只小跳蛙
我找到了解决方案。我们可以通过刷新令牌来检查令牌是否有效。如果刷新导致错误,则令牌不再有效。如果刷新成功,令牌将再有效一个小时。因此,我们向后端添加了(可重用的)函数以使用https://directline.botframework.com/v3/directline/tokens/refresh. 我们更改了前端代码以调用我们新的刷新功能。前端代码:// Gets a new token from the cloud.async function requestToken() { if (!sessionStorage['webchatToken']) { const res = await fetch('https://' + serviceName + '.azurewebsites.net/api/token'); // If the request was succesfull, store the token and userId. if (res.status == 200) { const jsonResult = await res.json(); sessionStorage['webchatToken'] = jsonResult.token; sessionStorage['webchatUserId'] = jsonResult.userId; console.log(`Got token from cloud`); // refresh the token every 15 minutes. setTimeout(() => { refreshToken(); }, 60000 * 15); // 15 minutes } // If the request was not succesfull, retry. else { console.log(`Tried to get token, but goterror ` + res.status + `. Retrying.`); await requestToken(); } } // If there is already a token in storage, refresh the existing one instead of requesting a new one. else { console.log(`Got token from sessionStorage`); await refreshToken(); }}// Refreshes an existing token so it doesn't expire.async function refreshToken() { // Refresh the token if it exists in storage. if (sessionStorage['webchatToken']) { const res = await fetch('https://' + serviceName + '.azurewebsites.net/api/token/refresh?token=' + sessionStorage['webchatToken'], { method: 'POST' }); // If refresh was succesfull we are done. if (res.status == 200) { console.log(`Refreshed token`); } // If refresh was not succesfull, clear the token from storage and request a new one. The token is probably expired. else { console.log(`Tried to refresh token, but got error ` + res.status + `. Requesting new token.`); sessionStorage.clear(); await requestToken(); } } // If there is no token in storage, request a new token. else { console.log(`Tried to refresh token, but token is not defined. Requesting new token.`); sessionStorage.clear(); await requestToken(); }}后端代码:[HttpGet][Route("api/token")]public async Task<ObjectResult> GetToken(){ HttpClient client = new HttpClient(); HttpRequestMessage request = new HttpRequestMessage( HttpMethod.Post, $"https://directline.botframework.com/v3/directline/tokens/generate"); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _configuration.DirectLineKey); var userId = $"dl_{Guid.NewGuid()}"; request.Content = new StringContent( JsonConvert.SerializeObject(new { User = new { Id = userId } }), Encoding.UTF8, "application/json"); var response = await client.SendAsync(request); string token = String.Empty; int expiresIn = 0; if (response.IsSuccessStatusCode) { var body = await response.Content.ReadAsStringAsync(); token = JsonConvert.DeserializeObject<DirectLineToken>(body).token; expiresIn = JsonConvert.DeserializeObject<DirectLineToken>(body).expires_in; } return Ok(new { token, userId, expiresIn });}[HttpPost][Route("api/token/refresh/")]public async Task<ObjectResult> RefreshToken(string token){ HttpClient client = new HttpClient(); HttpRequestMessage request = new HttpRequestMessage( HttpMethod.Post, $"https://directline.botframework.com/v3/directline/tokens/refresh"); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token); var response = await client.SendAsync(request); token = String.Empty; int expiresIn = 0; if (response.IsSuccessStatusCode) { var body = await response.Content.ReadAsStringAsync(); token = JsonConvert.DeserializeObject<DirectLineToken>(body).token; expiresIn = JsonConvert.DeserializeObject<DirectLineToken>(body).expires_in; } if (string.IsNullOrEmpty(token)) return Problem("Token incorrect"); return Ok(new { token, expiresIn });}我希望发布这个可能对某人有用。