后端层面
- 前端登录成功之后,后端拿到useID,之后后端生成一个随机的密钥,密钥+useId来生成签名(token)返回给前端,同时把Jti(JWT id)存在redis里面(后端每次都随机生成密钥提高了安全性,jti存储在redis里面提高了读取速度)
- 前端带token去请求,后台decode token 得到jti,拿到redis里面查是否有对应的jti,如果有就认为是合法的
前端层面
前端拿到token的存储有三种方式
-
sessionStorage ,浏览器关闭就没了。
-
存 localstorage 就一直都在,后端返回过期标识时前端主动清除
-
存cookie的话,后端可以过期主动清除cookie, 前端在此过程中主要配合跳转到登录页就行
对于vue,为解决浏览器刷新路由重置的问题
拿到token后要将其保存到sessionStorage,根组件的created钩子负责检查本地是否已有token,如果有则无需登录直接用该token获取权限并初始化,如果token有效且当前路由有权访问,将加载路由组件并正确展现;若当前路由无权访问将按路由设置跳转404;如果token失效,后端应返回4xx状态码,前端统一为axios实例添加错误拦截器,遇到4xx状态码执行退出操作,清除sessionStorage数据并跳转到登录页,让用户重新登录。