Jwt创建身份令牌Token

来源:互联网 发布:关联数组和索引数组 编辑:程序博客网 时间:2024/06/07 16:41
                      
     最近再做一个的个人社区,首先就是解决登陆的问题。
     根据最近的学习和网上看的资料,来做一下安全登录(纯口述,代码后面附上)。
     前端使用AngularJS,对于用户的密码是用RSA非对称加密方式进行加密,对于RSA我最直白的印象就是
:没有秘钥的情况暴力破解可能性为0,相对RSA有深入了解的的可以自行百度。在我项目中就是前端发送
请求的密码进行RSA加密,服务端通过秘钥进行解密,同数据库中的密码进行匹配,同时我的数据看中存储
的密码也是用MD5码进行编码的非明文存储,为什么这么做,因为是供自己学习的项目,就多多实验一些东西,
有不合理的地方还请指出。
当用户匹配成功之后,我们会返回一个Token,我是如何理解Token的:当我们登录成功之后,为防避免下一次
再进行一次身份匹配的工作,我们将登录的信息存储到Token中,返回给前端,在用户每次发送请求的时候,
其请求头都会带着该Token,服务端在拦截器中对Token进行验证,合法即放行。在了解Token的过程中我遇到
一些问题或者说发现一些问题:
单点登录:用户登录的情况下,在另一个浏览器或者机器登录会获取到一个新的Token,此时之前的Token在没有
失效的情况下也应该失效,从而挤掉上一台电脑的账号。我最初想的是新用户登录的时候,获取上一次存储在数据
库中的token,然后setExpiration方法来使其过期,但是实验过程中我发现,通过String类型解密成Claims类(jjwt maven 搜一下
然后将依赖加入到maven中,可以研究一下这些类以及如何生成Token)的时候
虽然可以setExpiration,但是其Token仍然是可用的,直到你在创建的时候设置的过期时间到了才会失效。只有你在JwtBuilder对象
里面setExpiration才是真正有效的,想过吧对象保存起来,但是jar中的类没有序列化,所以各种操作都失败了,最终我只能这样解决:
客户每一次发送请求的时候,Token都和数据库中的token进行一次比较,相同则说明没有在其他地方登录,不相同则说明有新的token生成
也就是有在其他地方登陆,强制下线,阻断请求。但是由于进行数据库查询操作,我总感觉很不爽。。。。但是目前我没有别的办法,欢迎
留言指导。
 安全的问题,我想的是,如果请求头被截取,那么跨站伪造请求怎么处理。虽然我所了解的,如果请求头都被获取了,说明用户电脑安全存在问题
 基本上是无解(受个人知识所限,有问题多多指教,后面就不在重复这句话了,哈哈),我还是想到一个方案但是被自己推翻了,就是每次请求
 都刷新token,当用户token被截获,那么刷新出的token会使上一个token失效,进而告知用户修改密码或者其他挽回措施,但是我想了想有问题,
 如果用户没有获取到修改密码的通知,或者不能及时获取,黑客不断的刷新token,那理论上这段时间里面他可以一直登陆,一直操作,直到
 用户收到通知,所以权衡一下,还是设置过期时间,过期重新登陆比较稳定一点,没有太多其他因素干扰。