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

时间:2016-10-05 18:24:21

标签: authentication jwt

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

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

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

5 个答案:

答案 0 :(得分:6)

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

  1. 用户登录,将刷新令牌存储在数据库
  2. 访问令牌过期。在从刷新令牌发出新的访问令牌之前,请进行标准检查以确定帐户是否正常,还要将刷新令牌与数据库中的刷新令牌进行比较。确保它们匹配。
  3. 第二位用户使用同一帐户登录 。将问题刷新令牌存储在数据库中,然后重写旧的刷新令牌。 (每个帐户存储一个刷新令牌。)
  4. 第一个用户访问令牌再次过期。这次DB中有另一个刷新令牌,并且没有为该用户发出新的访问令牌。
  5. 这将导致登录流程,登录的最新用户可以使用您的服务。如果它实际上是更改设备或重新启动浏览器会话的同一用户,则这很方便。比较Spotify的“追逐流”处理并发侦听的方式。

答案 1 :(得分:3)

我能想到的唯一答案:

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

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

在所有需要登录的请求上,匹配用户JWT-string和activeJWT(如果他们)   如果不匹配,则意味着在使旧令牌无效之后,另一台设备已登录。

答案 2 :(得分:1)

我现在在没有JWT的情况下进行测试,并使用密码授予令牌进行OAuth2身份验证。在一个客户端内,用户只能在一次登录时使用该应用程序,如果他登录另一个会话/设备,则另一个登录(令牌)将不再有效。当我想允许一个用户多次登录时(例如网络应用程序和移动应用程序),我可以使用多个客户端。

答案 3 :(得分:1)

无论如何,您都需要将令牌存储在db中。
为此,您将需要超快速的存储。 Redis将是完美的。
在新登录时,只需用新令牌替换令牌即可。
每次用户进行请求检查时,令牌是否与您在Redis中的令牌匹配。如果没有,那就把他踢出去。

答案 4 :(得分:0)

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

相关问题