YUE-PMS , 关于jwt token方案的一些实践

原创
2019/04/03 22:07
阅读数 650

       先说一下yue-pms中配置jwt方式的验证的配置吧:

项目地址:https://gitee.com/yueyakk/pms

  1  expireTime   :accessToken的过期时间,单位是秒。不配置的话,默认600s,也就是10分钟

  2  refreshTime:refreshToken的过期时间, 单位是天。不配置的话默认是 7*24 小时,也即是7天

  3  signMode: 签发token的签名秘钥的类型,目前提供配置两种,一种是对称加密方式:HS256,一种是非对称加密的方式: RS256,不配置的话,默认HS256

4   mode : 权限模式,normal:普通session方案,jwt:jwt token 方案。不配置的话,默认:normal

5  publicKey,privateKey,这两个配置是一起的,当选择RS256时,填上相应的公钥和私钥 ,当然,其他业务系统只需要配置公钥就行,权限系统公钥私钥都要填上,当选择HS256,两个都填一样的就行。懒得再弄一个配置参数了。

  对了 生成秘钥的方式,可以使用 com.yueya.auth.utils.KeysUtil提供的方法来生成。

  顺便提一下,一定要保管好密钥,泄露了,系统也就成了一个没关门的屋子了,并且最好使用https。

下面说一下开发中遇到的问题:

         jwt是什么,我想能看见这篇文章的人,应该都很清楚了,不清楚的去google一下,有很多科普。随着微服务概念的大火,jwt现在也变得越来越火,通俗点说,它就是一个服务端给客户端签发的令牌,客户端拿着这个令牌,就可以在有效期内在各个独立的服务之间畅行无阻,因为它本身就携带了证明自己身份的信息,这样就避免了要维护一个redis集群这种这种方式来维护用户session,减少了很多服务端的很过负担。

         但是,,软件开发没有银弹,有所得必有所失,一般控制权限都会有 登录,退出,在线用户查看,强制退出等需求,普通的session方案可以分方便的实现这些功能。但是到jwt这里就不行了,因为这个token它就像一张rmb,所有系统的逻辑都是认钱不认人,在钱用光(token过期)之前,它是一直合法的,它只能自己过期,签发后并不受服务端控制。如果服务端想做任何的校验,判断什么的,又会回到session方案的老路,那还折腾什么呢?

         所以为了解决这些问题,有人提出这种方案: 用户登录时,服务端返回两个token,一个是accesstoken,一个是refreshtoken,accesstoken的有效期比较短,一般都是十几分钟,客户端拿着这个token去服务端获取数据,二refreshtoken的有效期就比较长。一般是几天,并且服务端会将它保存在数据库中。当accesstoken过期时,客户端拿着refreshtoken去服务的token接口申请新的accesstoken。目前我就是实现的这套方案,具体:

  1 登录:jwt已实现

 2 退出:客户端清除accesstoken,并且通知服务端清除refreshtoken

3  在线用户查看:客户端会定期来获取accesstoken,可以在这个时候记录用户还是否在线

4 强制退出: 服务清掉指定用户的refreshtoken记录 。当用户下一次来请求accesstoken时就会知道自己已经被强制退出了,所以这期间是有一个时间窗口的,取决于accesstoken的过期时间,这是比较遗憾的地方,不如session方案那种,即时生效。

5 用户信息更新: 每次重新签发accesstoken的时候就可以顺便把用户信息更新了。也是有时间窗口的。不过这个应该根据具体业务定,如果业务要求实时更新,那么相关接口可以在接到请求时,自己去实时查一下用户的信息,而不是用jwt中携带的信息。

6: accesstoken和refreshtoken,可以一定程度的防止重放攻击,就算别人获取到请求过程中的accesstoken,当他实际想用时,这个accesstoken可能已经过期了。

7 ,当用户拿着refreshtoken去请求新的accesstoken时,这个过程中是可以去做一些安全上的判断和防范的,比如请求的device,ip,agent等和几分钟前比变了。就可以拒绝下发新的accesstoken,要求客户重新登录。

综上: jwt方案有很多便利性和优越性,但是要实际使用,和传统方案比,也得相应的做出一些相应的妥协。就看各位自己怎么想的了。

 

 

展开阅读全文
打赏
0
1 收藏
分享
加载中
大佬,项目访问地址多少啊http://127.0.0.1:1222/login,不行啊
05/14 17:59
回复
举报
yueyakk博主
http://47.102.218.172:8099/#/user/login
05/14 18:02
回复
举报
本地·启动,访问地址多少呢
05/15 09:36
回复
举报
大佬,这个项目还会继续维护吗
01/19 10:42
回复
举报
yueyakk博主
维护啊,如果有什么问题和建议,欢迎提出
01/19 10:50
回复
举报
更多评论
打赏
5 评论
1 收藏
0
分享
返回顶部
顶部