问题:如果用户一直在操作,那么就不能让token自动过期了,而应该自动刷新
还有如果用户在另一个地方重新登录,那么前一个登录的token应该失效而不能继续使用
这里原本用JWT就是想使用无状态登录,可是如果完全无状态登录,首先中间字段如果要保存用户ID等信息就暴露了部分信息,其次完全无状态服务端就对其不可控,而且也不能自动刷新,到时间就过期了,所以考虑后还是需要解决这些问题
解决办法:
关于Redis中保存RefreshToken信息(做到JWT的可控性)
- 登录认证通过后返回AccessToken信息(在AccessToken中保存当前的时间戳和帐号)
- 同时在Redis中设置一条以帐号为Key,Value为当前时间戳(登录时间)的RefreshToken
现在认证时必须AccessToken没失效以及Redis存在所对应的RefreshToken,且RefreshToken时间戳和AccessToken信息中时间戳一致才算认证通过,这样可以做到JWT的可控性 - 如果重新登录获取了新的AccessToken,旧的AccessToken就认证不了,因为Redis中所存放的的RefreshToken时间戳信息只会和最新生成的AccessToken信息中携带的时间戳一致,这样每个用户就只能使用最新的AccessToken认证
- Redis的RefreshToken也可以用来判断用户是否在线,如果删除Redis的某个RefreshToken,那这个RefreshToken所对应的AccessToken之后也无法通过认证了,就相当于控制了用户的登录,可以剔除用户
关于根据RefreshToken自动刷新AccessToken - 本身AccessToken的