我正在寻求对移动应用程序使用基于令牌的身份验证,以使用户只要尚未注销就可以保持登录状态。我的方法是在用户登录/注册时创建JWT刷新令牌。该令牌永不过期,并会继续刷新20分钟的访问令牌。
当他们注销时出现问题。我读过最好的方法是在Redis上将JWT列入黑名单,以存储撤销的密钥。但是,由于JWT永不过期,因此永远无法从Redis中删除该记录,并且会开始占用我很多内存。
我应该为此担心吗,还是Redis在这方面节省内存?有没有更好的方式来撤销JWT而没有到期?
答案 0 :(得分:2)
JWT令牌是一个自包含令牌。这意味着它会自行生存,直到到期并无法撤销。因此,根据定义,它必须过期。因为当它落入不正确的人手中时,它将提供对您资源的访问权限,而又无法撤消它。所以,是的,您应该为此实现而感到担忧。
这里的问题是您信任刷新令牌本身,因为它是JWT。实际上,您应该信任服务器。不是因为JWT不可信,而是因为刷新令牌不必是JWT。
将刷新令牌保存在内存中,包括到期时间。您可以从内存中删除过期的令牌。这意味着只能使用内存中存在的令牌来请求新的访问令牌。为了安全起见,请使用一次性刷新令牌。
流将是这样的:
注销后,从内存中删除刷新令牌。如果在此期间您希望撤销访问权限。只需从内存中删除刷新令牌即可。 5分钟之内,用户必须再次登录。