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剩余时间,只能按照最大时间处理)。

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

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

jwt用户注销 PHP,关于JWT用户主动注销、强制登出、忘记密码、修改密码的一些思考...相关推荐

  1. centos的mysql怎么删用户_linux/centos给Mysql创建用户、授权、查看、删除、修改密码、撤...

    linux/centos给Mysql创建用户.授权.查看.删除.修改密码.撤 linux/centos给Mysql创建用户.授权.查看.删除.修改密码.撤销权限 linux/centos给Mysql创 ...

  2. 通过session实现用户的登录与登出功能

    通过session实现用户的登录与登出功能 本文讲解,就是在常见的登录注册页面中,我们是如何在登录之后,把用户的信息传送到后面的网页. 首先讲解原理,原理是session功能,通过session的在当 ...

  3. 9_用户的登录和登出

    用户的登录和登出 之前我们已经讲到,项目到现在,我们一共建立了两个app,分别是article和bloguser. 登录 1. 配置根路由 打开iblog/urls.py path('bloguser ...

  4. MySQL 8.x 修改root用户密码/修改密码/重置密码/忘记密码(为了避免掉坑,值得收藏)

    操作系统:CentOS Linux release 8.2.2004 (Core) MySQL版本:mysql Ver 8.0.26 for Linux on x86_64 (Source distr ...

  5. oracle将原表数据加入新建表,Oracle新建用户并将原有表结构数据迁移,修改密码...

    1.新建用户并授权 create user 用户名 identified by 默认密码(与用户名一样) default tablespace 制定表空间名; grant connect ,resou ...

  6. 使用java基础完成一个简单的控制台输入的用户管理(包括用户注册,登录,修改密码,及一些相关校验)

    要求 实体类 //该类为用户对象的实体类 public class User {     private String name;     private String password;     p ...

  7. Django搭建个人博客:用户的登录和登出

    用户管理 用户数据可以说是大部分网站最重要的资产.用户管理就是对用户数据进行增删改查等操作的功能,自然也就非常的重要了. 本章开始学习用户管理的内容,首先从用户登录开始. 在Django中用app来区 ...

  8. Django1.6 用Form实现注册登录注销修改密码(含代码!)

    参照了潘军杰的博客,但他Django版本有点老了,改动了不少东西,总体来说参考价值还是很大的,点http://www.2goo.info/blog/panjj/Django/2010/06/05/94 ...

  9. linux修改密码和宽限天数,Linux chage用法详解:修改用户密码状态

    除了passwd -S命令可以查看用户的密码信息外,还可以利用 chage 命令,它可以显示更加详细的用户密码信息,并且和 passwd 命令一样,提供了修改用户密码信息的功能. 如果你要修改用户的密 ...

最新文章

  1. Qt编译错误:无法解析的外部符号 __imp__CloseServiceHandle __imp__OpenSCManager
  2. Codeforces 923 B. Producing Snow
  3. C# semaphore的使用
  4. Java中的Flyweight设计模式
  5. 移动互联网实时视频通讯之视频采集
  6. 数据结构图文解析之:二分查找及与其相关的几个问题解析
  7. 张超超OC基础回顾01_类的创建,申明属性,以及本质
  8. java如何制作简单的数组_【数据结构与算法】Java制作一个简单数组类
  9. latex中输入matlab代码,Latex插入matlab代码
  10. 防华为手表太空人主题界面 html5 代码实现
  11. Vue开发环境搭建 VsCode
  12. 使用J-Link打印日志——SEGGER Real-Time Transfer(RTT)工具的移植使用
  13. 应用程序正常初始化 0x0150002失败
  14. 入侵WIN2003 PHP服务器的另类技术
  15. java实例成员和类成员变量_Java 中成员变量又分为 和类成员变量。_学小易找答案...
  16. 内网渗透笔记——三层发现and四层发现
  17. sql server 自定义背景、字体及显示行数
  18. Mac下安装SecureCRT并激活 阿星小栈
  19. 狄利克雷分布公式_关于狄利克雷分布的理解
  20. 每日刷题记录 (六)

热门文章

  1. Flutter 身份证号格式化输入
  2. 取消windowsXP桌面图标下的蓝色阴影
  3. 互联网产品经理和原型设计
  4. 金蝶K3案例教程应付账款前台操作
  5. Linux教程第四版(孟庆昌)--思考题 2 答案
  6. 如何实现Linux系统与Windows系统的文件共享
  7. 关于队里面最菜的在博客打卡第十一天这件事
  8. bio/aio/nio以及多路复用器
  9. “菜鸟安服仔”必用兵器之“渗透测试篇一”
  10. 【NLP基础】常见的距离公式说明