redis + jwt实现token认证
redis + jwt实现token认证
文章目录
业务场景
-1.登录授权获取token2.登出使token失效3.续期token4.获取新的token
业务场景
在前后端分离的场景下,越来越多的项目使用token作为接口的安全机制,APP或者web端使用token与后端接口交互,以达到安全的目的
-
-
获取前端请求的token判断token是否为空token不为空,则查询redis缓存是否有相关token有相关token则通过拦截,请求资源
1.登录授权获取token
第一种业务场景就是最普遍的登录授权获取到token后,前端带上token去请求资源接口,token具有一定有效期限
流程图
流程解释
流程:
1.前端传unionid给后端2.后端生成jwt后,以token:unionid为key将token存入redis3.调用拦截路径外的接口需要提供token。4.后端拿到token后查询redis是否有相关token,有则放行
@Autowired private RedisUtils redisUtils; /** * jwt + redis 实现登录授权 * 流程: * 1.前端传unionid给后端 * 2.后端生成jwt后,以token:unionid为key将token存入redis * 3.调用拦截路径外的接口需要提供token。 * 4.后端拿到token后查询redis是否有相关token,有则放行 * @param unionId * @return */ @RequestMapping("/login") public AjaxResult login(@RequestParam("unionId") String unionId){ // ----- 验证用户名密码 ------ //JWT token String token = null; //生成token if(unionId != null || "".equals(unionId)) { try { Map claims = new HashMap
2.登出使token失效
登出的时候需要删除相关token,使token失效
/** * 用户登出并且使jwt token失效 * 流程: * 1.前端传入unionid * 2.后端删除redis中key为token:unionid的token * @Param unionId * @return */ @RequestMapping("/loginOut") public AjaxResult loginOut(@RequestParam("unionId")String unionId){ String key = "token:"+unionId; redisUtils.del(key); return new AjaxResult().ok("登出成功"); }
测试
token为空情况下请求资源接口
请求结果:
使用已经登出的token去请求资源接口
3.续期token
流程:
1.前端传入unionid和续期时间2.后端重新设置token失效时间为:剩余时间 + 指定失效时间
/** * 续期token * 流程: * 1.前端传入unionid和续期时间 * 2.后端重新设置token失效时间为:剩余时间 + 指定失效时间 * @param unionId * @return */ @RequestMapping("/renewalToken") public AjaxResult renewalToken(@RequestParam("unionId")String unionId, @RequestParam("time")long time){ String key = "token:"+unionId; if(redisUtils.get(key) == null){ return new AjaxResult().ok("token不存在"); } long oldTime = redisUtils.getExpire(key); log.info("oldTime:"+oldTime); boolean b = redisUtils.expire(key,oldTime+time); return b == true ? new AjaxResult().ok("续期成功") : new AjaxResult().error("续期失败"); }
申请新的token
剩余过期时间
续期
续期后的token过期时间
4.获取新的token
当token失效,前端还可以请求这个restful接口获取有效token,流程和登录授权接口差不多
/** * 获取新的token * 流程: * 1.前端传入unionid后端刷新token * 2.后端刷新redis缓存 * @param unionId * @return */ @GetMapping(value = "/token/{unionId}") public AjaxResult getNewToken(@PathVariable(name = "unionId") String unionId) { String token = null; if (StringUtils.isBlank(unionId)) { return new AjaxResult(502, "unionId为空"); } //获取token Map claims = new HashMap
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~