在多个设备上刷新令牌

Kar*_*rro 19 refresh-token

我有一个 Api 和一个移动客户端。我使用刷新令牌如下:

  1. 用户提供凭据,Api 返回访问令牌和刷新令牌。然后刷新令牌及其到期日期时间保存在数据库的用户表中。
  2. 客户端使用给定的访问令牌消耗一些受保护的资源。
  3. 访问令牌过期,因此客户端提供刷新令牌并获取新的令牌对。
  4. 步骤 2 和 3 不断重复。

问题:假设用户有 2 个设备,A 和 B。他使用设备 A 成功登录,因此他获得了 2 个令牌,他很高兴。一旦用户从设备 B 登录,Api 就会向他发送一对新的令牌,这意味着新的刷新令牌将覆盖设备 A 已经给定的令牌。现在用户返回设备 A aaa,它就消失了(无效刷新)令牌!)所以他必须再次提供凭据,而我、用户和您都不希望这样做。

建议:我找到了两种解决问题的方法,但因为我对这个主题还很陌生,所以我看不出哪种方法是最佳实践:

方法 A:为每个用户保存多个刷新令牌,并保存设备标识符(仍然不知道在移动、浏览器和桌面客户端等不同客户端类型的情况下究竟会发生什么!)但无论如何。在此方法中,当用户从设备 A 登录时,Api 会提供两个令牌。用户从设备 B 登录,Api 会传递新的令牌对。他返回设备 A,再次使用他的第一个令牌(仍然有效)。

方法 B:为每个用户保留 1 个刷新令牌。当用户从设备 B 登录时,Api 发回唯一的刷新令牌(只要用户提供有效的凭据,我就不应该关心设备,对吧?)

您能指出每种方法的优缺点吗?

Eve*_*ert 15

方法 A 是处理此问题的正常方法。访问/刷新令牌不应不同的会话/设备之间共享。

每个人都应该得到自己的一双。当您使用该refresh_token操作时,它应该仅使与该请求一起使用的刷新令牌过期,而不是任何不相关的令牌。

  • 我会。最后一件事,如果每个用户有多个刷新令牌,并且用户在许多不同的设备上使用有效凭据发布大量登录信息,那么我将在数据库中保存许多令牌。现在,如果用户执行注销,我将删除该令牌。如果他想要全局注销,我将删除该用户的所有刷新令牌。如果他登录了这么多设备并且从未退出怎么办?令牌最终会过期,但它们只是挂在数据库中!我应该有一个工作人员每天运行一次以清除数据库中的所有过期令牌吗? (2认同)
  • @RelaxedCoder 根据我的经验,大多数用户不会注销!因此,与用户明确使用注销功能相比,刷新令牌更有可能超时。 (2认同)