吊销JWT而没有到期

时间:2018-11-10 19:53:00

标签: authentication oauth-2.0 jwt

我正在寻求对移动应用程序使用基于令牌的身份验证,以使用户只要尚未注销就可以保持登录状态。我的方法是在用户登录/注册时创建JWT刷新令牌。该令牌永不过期,并会继续刷新20分钟的访问令牌。

当他们注销时出现问题。我读过最好的方法是在Redis上将JWT列入黑名单,以存储撤销的密钥。但是,由于JWT永不过期,因此永远无法从Redis中删除该记录,并且会开始占用我很多内存。

我应该为此担心吗,还是Redis在这方面节省内存?有没有更好的方式来撤销JWT而没有到期?

1 个答案:

答案 0 :(得分:2)

JWT令牌是一个自包含令牌。这意味着它会自行生存,直到到期并无法撤销。因此,根据定义,它必须过期。因为当它落入不正确的人手中时,它将提供对您资源的访问权限,而又无法撤消它。所以,是的,您应该为此实现而感到担忧。

这里的问题是您信任刷新令牌本身,因为它是JWT。实际上,您应该信任服务器。不是因为JWT不可信,而是因为刷新令牌不必是JWT。

将刷新令牌保存在内存中,包括到期时间。您可以从内存中删除过期的令牌。这意味着只能使用内存中存在的令牌来请求新的访问令牌。为了安全起见,请使用一次性刷新令牌。

流将是这样的:

  1. 用户登录,收到JWT访问令牌(5分钟)和刷新令牌1代码(48小时)。刷新令牌1已保存在服务器上。
  2. 五分钟后:访问令牌到期
  3. 使用刷新令牌1请求新的访问令牌。
  4. 用户收到一个新的访问令牌(5分钟)和刷新令牌2代码(48小时)。从内存中删除令牌1,并将令牌2添加到内存。
  5. 这会持续几个小时。
  6. 用户有两天没有使用该应用
  7. 50小时后:由于两个令牌都已过期,因此用户必须再次登录。重置流程。

注销后,从内存中删除刷新令牌。如果在此期间您希望撤销访问权限。只需从内存中删除刷新令牌即可。 5分钟之内,用户必须再次登录。