Angular 浏览器关闭时删除项目令牌

Angular project Token removal when browser is closed

我有一个 angular 项目,我在这个项目中提供了基于令牌的登录。当用户使用退出按钮退出时,我从数据库中删除了当前的token,但是当浏览器直接关闭时我无法删除它。我该怎么做?

处理程序代码:

public async Task<IResult> Handle(LogoutCommand request, CancellationToken cancellationToken)
            {
                var isThereAnyUser = await _userRepository.GetAsync(u => u.UserId == request.UserId);
             
                isThereAnyUser.Token = "";
                isThereAnyUser.RefreshToken = "";
                _userRepository.Update(isThereAnyUser);
                await _userRepository.SaveChangesAsync();
                return new SuccessResult(Messages.logOutMessage);


            }

Wep api代码:

 public async Task<IActionResult> Logout([FromBody] LogoutCommand logoutCommand)
        {
            var result = await Mediator.Send(logoutCommand);
            if (result.Success)
            {
                return Ok(result.Message);
            }
            else
            return BadRequest(result.Message);
        }

很难在所有情况下并跨各种浏览器实现此功能,因此您无论如何都需要一个备份解决方案来处理令牌过期。

作为替代方案,您可以为令牌指定一个存储在数据库中的到期时间,并在每次使用令牌访问 API.

时更新到期时间

流程可以概括如下:

  • 用户登录:如果没有有效令牌,将创建一个登录时间 + 5 分钟的令牌。否则拒绝登录。
  • 用户访问 API(使用令牌):令牌更新访问时间 + 5 分钟(如果没有 API 访问,Angular 应用程序可以定期调用API 扩展令牌)
  • 用户注销:Token被删除;用户可以立即在另一台设备上登录
  • 用户未注销但关闭浏览器:Token 5分钟后过期;在此之前,用户无法从另一台设备使用 API。因此到期时间应该很短(本例中为 5 分钟)

作为将到期时间存储在数据库中的替代方法,您也可以将其存储在令牌中,但您需要根据 API 请求(或定期调用)交换令牌。