Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Authentication 使用JWT每次登录允许一个并发用户_Authentication_Jwt - Fatal编程技术网

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

Authentication 使用JWT每次登录允许一个并发用户,authentication,jwt,Authentication,Jwt,我们正在使用Laravel/PHP开发一个应用程序,我们希望使用按用户付费的定价模型。为此,我们必须确保一个帐户只能由一个并发用户使用。我们使用JWT进行身份验证,它是无状态的,所以我不能使用会话 为了确保一次并发登录,我可以将浏览器代理或IP封装起来,但两者都不是唯一的,它们可能在办公室中多次出现。我也可以发送MAC地址,但这不是最简单的方法 还有其他解决方案可以确保每个用户使用JWT同时登录一次吗?我能想到的唯一方法是禁用该功能,在令牌的生命周期内为新令牌签名。我认为简单的答案是否定的,JW

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

为了确保一次并发登录,我可以将浏览器代理或IP封装起来,但两者都不是唯一的,它们可能在办公室中多次出现。我也可以发送MAC地址,但这不是最简单的方法


还有其他解决方案可以确保每个用户使用JWT同时登录一次吗?

我能想到的唯一方法是禁用该功能,在令牌的生命周期内为新令牌签名。我认为简单的答案是否定的,JWT无法做到这一点并保持服务器无状态。但是,如果将设置与访问令牌和刷新令牌一起使用,则可能会实现以下功能:

  • 如果用户登录,则将刷新令牌存储在数据库中
  • 访问令牌过期。在从刷新令牌发出新的访问令牌之前,请进行标准检查,确保帐户仍然正常,但还要将刷新令牌与数据库中的令牌进行比较。确保它们匹配
  • 第二个用户使用相同的帐户登录。将问题刷新令牌存储在数据库中,并重写旧的刷新令牌。(每个帐户存储一个刷新令牌。)
  • 第一个用户访问令牌再次过期。这一次数据库中有另一个刷新令牌,并且没有为该用户颁发新的访问令牌

  • 这将产生一个登录流,最新登录的用户可以使用您的服务。如果更改设备或重新启动浏览器会话的用户实际上是同一用户,则此操作非常方便。例如,与Spotify处理并发监听的“追踪流”方式相比。

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

    我能想到的唯一答案是:

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

    用户登录并创建JWT令牌后,将JWT字符串复制到值activeJWT 并将其发送给用户。 如果您登录到另一台设备上,则同一笔交易的activeJWT值将发生更改

    在所有需要登录的请求上,匹配用户JWT string和activeJWT(如果需要)
    “不匹配”表示在使旧令牌无效后另一台设备登录。

    无论如何,您需要将令牌存储在db中
    为此,您需要超高速存储。Redis将是完美的
    在新登录时,只需将令牌替换为新令牌。

    每次用户发出请求时,都会检查令牌是否与您在redis中拥有的令牌匹配。如果没有,那就把他踢出去。

    你可能会从这个RFC提案中得到一些想法:这也会阻止用户再次登录到另一台设备,或者如果浏览器在令牌的生命周期内重新启动。使用隐式流的SPA应用程序如何?这意味着在这种情况下没有刷新令牌的概念?如果我正确理解第3点和第4点,是否会出现这样的情况:如果第一个用户的令牌未过期,而第二个用户登录,那么两个用户都将保持登录状态,直到第一个用户的令牌过期?在SPA中,令牌也可能过期,应用程序必须只知道如何刷新它,并在后台过期之前刷新它。请记住设置一个足够短的过期时间,但足以让每个应用程序不时刷新它。@Hiren是对的,根据应用程序的性质,将其与合理的较低过期时间相结合,将减少2次同时用户登录的可能性,但这并不能完全消除它。好主意,它也很有效,谢谢!因为我使用的是Spring,所以我使用了一个
    HandlerInterceptorAdapter
    来测试JWT与数据库中存储的JWT。然后你就失去了JWT的优点,即你不需要访问数据库来获取用户详细信息并检查每个请求的用户是否经过身份验证。简单而优雅