JWT 刷新令牌是否有替代品?

Are There Alternatives to JWT Refresh Tokens?

提问人:Chris Barr 提问时间:11/7/2023 更新时间:11/7/2023 访问量:70

问:

我正在后端使用 NestJS (Node) 构建一个应用程序,在前端使用 Angular。我使用 JWT 进行身份验证。登录后,我发送访问令牌和到期持续时间(1 小时)。

{
  "accessToken": "eyJhbGciOsdfvrNiwBInR5cCI6I4kpXVCJ9.xxxx.xxxx",
  "expiresIn": 3600
}

在我的 Angular 应用程序中,每当我收到身份验证信息时,我都会将计时器重置为在持续时间后自动注销。所有这些信息都存储在 localStorage 中。所以问题是,登录后,即使您正在积极使用该应用程序,也会在 1 小时内自动注销。正如您所料,这很烦人。

private autoLogOut(expirationDurationMs: number): void {
  this.autoLogoutTimer = setTimeout(() => {
    this.logOut();
    this.toastSvc.showWarning('You have been automatically logged out.', { autohide: false });
  }, expirationDurationMs);
}

private getExpirationDate(expiresIn: number): Date {
  const expiresInMs = expiresIn * 1000;
  return new Date(new Date().getTime() + expiresInMs);
}

private handleAuthentication(data: IAuthResponse): void {
  const expDate = this.getExpirationDate(data.expiresIn);
  const authData = new AuthData(data.accessToken, expDate);

  this.authDataChanged$.next(authData);
  this.autoLogOut(data.expiresIn * 1000);
  this.toastSvc.clear(); //clear any toasts that were hanging around (auto logout or bad password attempts)
  localStorage.setItem(AccountService.STORAGE_KEY_TOKEN, data.accessToken);
  localStorage.setItem(AccountService.STORAGE_KEY_EXPIRATION_DATE, expDate.toString());

  this.accountChanged$.next(data.account);
}

我一直在阅读刷新令牌,到目前为止,我只对这个概念有所了解。我没有看到这与常规访问令牌之间有太大区别,只是它的存在时间更长。

JWT 刷新令牌是继续此处的最佳方式,还是我可以使用其他方法来重新颁发/更新 1 小时身份验证令牌?在当前令牌持续时间的~75%之后自动重新请求身份验证令牌是否是一种更简单的方法?示例:对于 1 小时令牌,如果您在 45 分钟后仍在使用该应用程序,它会自动将您再延长一小时。我喜欢这个想法的概念,但我几乎可以肯定,它周围有一些我没有看到的问题。

Angular JWT nestjs 访问 刷新令牌

评论

0赞 IMSoP 11/7/2023
正如你所发现的,有一大堆关于刷新令牌的问题。其中一些非常具体,其他像您这样的人是试图理解这个概念及其优缺点的人。它是否“最好”是一个见仁见智的问题,为什么有人使用它是阅读一些关于这个概念的现有介绍的问题,所以我不确定这里是否真的有一个可以回答的问题。
0赞 Chris Barr 11/7/2023
@IMSoP我想我真正的问题是我加粗了什么。而不是刷新令牌,在活动使用一段时间后自动重新授权是一个好主意吗?这似乎更简单,但同时感觉就像“滚动自己的加密”,并且可能有一个很好的理由不这样做。主要是在问,是否有具体的原因说明朝这个方向前进会很糟糕
0赞 IMSoP 11/7/2023
但这仅相当于“刷新令牌和访问令牌之间有什么区别?如果答案是“是的,一个代币就足够了”,那么刷新代币就不会被发明出来,所以很明显,人们已经确定了它们分开的一些优势;希望在对这一概念的任何介绍中都能描述这一优势。
0赞 Chris Barr 11/7/2023
好吧,公平点。所以我想我的问题的答案是“不,这是一个坏主意 - 使用刷新令牌”
0赞 pcalkins 11/8/2023
按原样,您可以只使用会话 cookie。当浏览器关闭、您离开页面或注销时,这些将过期。(并且可以防止 XSS 攻击,这与 localstorage 不同)刷新令牌与会话令牌的不同之处在于,它们被设计为一次性使用。您无法真正撤销会话令牌,但可以撤销刷新令牌。

答: 暂无答案