token设计:
随机字符串1+用户名+用户ID+登录IP+登录时间+随机字符串2
randomSecret+","+username+”,”+userId+”,”+IP+”,”+loginTime+","+randomSecret
随机字符串1=encode(IP+LoginTime)
随机字符串2=encode(随机字符串1)
redis存储K-V:
key:username+”,”+id
value: ip+”,”+loginTime+","+randomSecret
关键点:
- redis的key必须可确定,容易获取,才能保证校验(通过username+id实现)
- 返回前端的token必须具有随机性(添加randomSecret,由IP+时间生成,时间不定,则每次不一样)
登录实现:
- 前端传参username,password;
- 通过username查出user,得到userId和加密密码;
- 初始化boolean flag=false,构造key:username+”,”+id,在redis中查询记录,若成功查到结果(即ip+loginTime+randomSecret),则解析字符串,将ip和loginTime放在一个map中,设置flag=true;
- 密码比对,若比对成功,构建token,然后判断flag,若为true,将token加到map中,并添加提示语,再将map返回,若为false,则直接返回token。
此时前端能够拿到用户上一次的登录信息,根据业务需求做动态处理。
token只需要对前端加密,redis中的信息可以明文存储。
token验证与注销
拿到token解密得到username+id+ip+time,拆分得到key,查询value,进行比对或者删除即可。