我打算利用业余时间,做个小互联网产品来运营玩玩。目的是打发时间,学习并实际使用新技术,写此系列文章作为记录。不保证开发进度,不定时更新,看时间和心情。各位看官欢迎交流,希望不吝赐教,大家共同进步。
JWT,全称是JSON WEB TOKEN,是一个开放的标准协议,我第一次接触还是用node做后端服务的时候。想了解更多朋友可以自行搜索了解。
这里我想介绍下我设计的登录认证的过程,如果有什么漏洞或者高见,欢迎评论交流。
登录认证设计思考历程
一开始我觉得session就够用嘛,我又不是做APP。但是有效期不能设置太长,毕竟占内存。
然后又想到自定义token认证,曾经我设计过一套token认证,用Redis存储,每次http响应回去给前端一个新的,旧的token2分钟内失效,最新的那个7天内有效。可以支持多端登录,也支持单端登录(就像以前QQ只允许登录一个手机)。这套token确实也不错,但是也占内存,我服务器资源有限,不得不慎重考虑。
思来想去,我还是不要造轮子了,用JWT吧,存储成本分散到客户端上,服务器验证一下就好了。
设计思路
说到认证的设计,不得不想到“角色”、“权限”的设计,我这个小产品,初步设计了3个角色。
- 超级管理员 - 拥有最高权限
- 管理员 - 有用小区的管理权限,用在后台管理系统。
- 普通用户 - 用在公众号H5应用,移动端
我们都知道jwt的payload可以放信息,我设计放置上面说的角色,还有用户的openid
json web token生成
JWT的结构设计完成,可以思考在什么时候发放jwt,什么时候刷新jwt了。
直接说结论,经过小小的迭代,我最终的设计如下:
微信登录+jwt认证
文字再简述一下关键点:
- 先走微信登录流程,在后端最后重定向回前端之前,先在session里存一下jwt。
- 前端再次发请求,虽然没带上jwt,但是后端知道你有,并把它放到响应头。
- 前端拦截每个响应头,发现有jwt,就刷新本地的jwt并在下次带上。
- 后端在jwt快过期的时候,会重新生成一个新的jwt给前端,通过响应头返回。
大家有没更好的方式?欢迎讨论