jwt token注销_关于JWT用户主动注销、强制登出、忘记密码、修改密码的一些思考...

本文讨论了在使用JWT进行身份验证时遇到的用户主动注销、强制登出、忘记密码和修改密码等场景的处理策略。提出了两种解决方案,包括利用Redis存储JWT并更新以实现注销和鉴权,以及区分可预知和不可预知操作以优化数据库查询。同时,文章也指出这种方法仍存在查库需求,但能减少数据库存储内容。
摘要由CSDN通过智能技术生成

JWT(JSON WEB TOKEN)的特点是无状态,通常用来作为验证登录以及鉴权,在这一方面,JWT体现出了他的优点。

然而,如果使用JWT实现,用户主动注销、强制登出(禁止登陆)、忘记密码、修改密码,JWT续签等方面的需求,就会让人头疼。

按照网上的一些讨论,我概括如下:

1、将每一个签发的JWT保存在REDIS上,当出现上述的需求时,就更新对应的JWT,如果客户端与REDIS中的不同,那么登录失败。

这种方法虽然可以解决上述问题,但是此时JWT似乎变成了有状态的了,部分失去了JWT的优点。

2、在签发、鉴别JWT中,不使用公共的秘钥,而是为每一个账户保存一个对应的秘钥,当客户端发来请求时,使用秘钥验证,如果失败说明这个JWT已经失效,可以实现上述的功能。

然而,对于每一个请求都需要在数据库中查找对应的秘钥,这为服务器增加了负担。

3、如果用户主动注销,或者主动修改密码,仅仅在客户端对之前的JWT删除(此时,如果获得了之前的JWT仍然可以登录),似乎不会对安全性带来影响,因为此时,之前的JWT并没有被泄露。

然而有没有一种方式可以不使用数据库来实现上述功能?

这个问题的答案我也不清楚。

不过希望我提供的这一个方案可以给大家一些思路。(如有雷同纯属巧合)

使用JWT的一个原则是尽可能的发挥它无状态的优点。

一般来说,在Restful的操作中,用户发生正常操作的概率,远远大于上述5个操作。为了充分利用这一点,减少查库操作,我把上述五个功能分为2个部分

可预知:用户主动注销、修改密码、以及JWT续签

可预知:服务器在当前请求中,知道当前操作的一个效果是为了失效当前JWT,在这个部分中,服务器清楚地知道需要失效的JWT的实际值。

解决方案:当服务器收到一个可预知的请求时,首先在redis中查询是否存在当前JWT,如果存在返回false,否则在redis中插入当前jwt,这条数据的失效时间为当前jwt的剩余有效时间。

不可预知:强制登出(禁止登陆)、忘记密码、

不可预知:服务器在当前请求中,知道当前操作的一个效果是为了失效某个JWT,这个JWT的实际值未知,但是这个JWT所对应的账户已知。

解决方案: 解析这个JWT后,得到AppID,timeStamp、查询redis,如果对应AppID 的timeStamp小于 redis中的timeStamp,返回false,否则在redis中插入当前AppId,与当前时间戳,这条数据的失效时间为JWT生存期。(因为无法得到签发的JWT剩余时间,只能按照最大时间处理)。

上述方法缺点:还是避免不了查库,但是减少了库中存放的内容

如果上述方法存在漏洞,欢迎指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值