关于JWT退出登录的问题
来源:7-8 获取不到数据?可能是方法互斥的锅
LBruce
2020-09-27
场景:
最近在做一个项目,用户登录后直接返回一个具有有效期的JWT,以后客户端在每次访问的时候,都在Http Header中携带这个Token用以验证用户信息。
问题:
由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token。那么实现主动注销、强制登出、忘记密码、修改密码等方面功能的时候就很麻烦了。
现在想到的方案有
可能的解决方案:
将Token存入DB(MySQL、Redis)中,比如说用户需要登出的话,将DB中的Token删除,那么下次用户再访问的时候,先去查询DB中是否存在用户相关的Token,从而判断是否用户是否已登录。
只让前端处理,用户登出的话,前端删除存储的Token。但是这个Token在未过期之前,依然可用。
做一个黑名单,用户选择退出登录后,将Token放入黑名单中,每次有请求过来时都校验Token是否在黑名单中,且定期清理黑名单。
疑惑:
但是上述方案除了只让前端处理外,让无状态的JWT变成有状态,跟使用session差不多了。不知道老师在这方面有没有研究?如果是老师的话,老师会怎么处理这个问题?谢谢老师
1回答
-
Bruce 你好:
你这里所说的问题其实就是类似于登录认证用户信息的行为,首先,我可以肯定的说,让前端去处理肯定是不可行的。在做 Web 开发的时候,谨记一句话,客户端和前端不要去管理任何状态信息,他们只负责展示,所有的逻辑行为都交由 Server 去处理。
所以,对于这类问题,Token 肯定是由 Server 去存储的,MySQL 或者 Redis 都是可行的,设置过期时间,前端/客户端访问时,带上相关凭证,Server 去实现校验。
(1)校验成功,用户信息就可以在 Server 中获取,任你怎么操作
(2)校验失败,返回 400,认证出错
这是一类通用的判断准则,应该是几乎所有的系统都是这样去实现的。
我是勤一,致力于将这门课程的问答区打造为 Java 知识体系知识库,Java 知识体系 BBS!共同建造、维护这门课程,我需要每一个你!
312020-09-27
相似问题