每次使用JWT登录时允许一个并发用户

Ger*_*man 9 authentication jwt

我们使用Laravel/PHP开发应用程序,并且我们希望使用按用户付费的定价模型.为此,我们必须确保一个帐户只能由一个并发用户使用.我们使用JWT进行身份验证,它是无状态的,所以我不能使用会话.

为了确保一个并发登录,我可以包含浏览器或IP,但两者都不是唯一的,并且它们可能在例如办公室中多次出现.我也可以发送MAC地址,但这不是最简单的方法.

是否有其他解决方案可确保每个用户使用JWT进行一次并发登录?

小智 11

我能想到的唯一答案:

登录时:数据库中的“用户”有一个值 = activeJwt

用户登录并创建 JWT 令牌,将 JWT 字符串复制到数据库中的值 activeJWT 并将其发送给用户。如果您在另一台设备上登录相同的交易,并且 activeJWT 值已更改

在所有需要登录的请求中匹配用户 JWT-string 和 activeJWT,如果它们不匹配,则意味着另一个设备在使旧令牌无用后登录。

  • 那么你就会失去 jwt 的好处,即你不需要访问数据库来获取用户详细信息并检查用户是否对每个请求进行身份验证。 (5认同)

And*_*ren 7

我认为对此的简单答案是否定的,你不能通过JWT做到这一点并保持服务器无状态.但是,如果您使用具有访问令牌和刷新令牌的设置,您可能可以实现如下所示:

  1. 用户登录后,将刷新令牌存储在数据库中
  2. 访问令牌到期.在从刷新令牌发出新的访问令牌之前,请进行标准检查以确定帐户是否正常,还要将刷新令牌与数据库中的刷新令牌进行比较.确保它们匹配.
  3. 第二个用户使用同一帐户登录.将问题刷新令牌存储在数据库中,然后重写旧的刷新令牌.(每个帐户存储一个刷新令牌.)
  4. 第一个用户访问令牌再次到期.这次DB中有另一个刷新令牌,并且没有为该用户发出新的访问令牌.

这将导致登录流程,登录的最新用户可以使用您的服务.如果它实际上是更改设备或重新启动浏览器会话的同一用户,则这很方便.比较Spotify的"追逐流"处理并发侦听的方式.

  • 如果我正确理解了第 3 点和第 4 点,是否会出现以下情况:如果第一个用户的令牌未过期并且第二个用户登录,那么两个用户将保持登录状态直到第一个用户的令牌过期? (2认同)

Jou*_*ner 0

我唯一能想到的在不保存服务器上状态的情况下执行此操作的方法是禁用在令牌的生命周期内签署新令牌的功能。

  • 这还可以防止用户在另一台设备上再次登录,或者在令牌的生命周期内重新启动浏览器。 (4认同)