token 过期后,如何自动续期?

news/2024/7/5 2:32:43

欢迎关注方志朋的博客,回复”666“获面试宝典

JWT token的 payload 部分是一个json串,是要传递数据的一组声明,这些声明被JWT标准称为claims。

JWT标准里面定义的标准claim包括:

  • iss(Issuser):JWT的签发主体;

  • sub(Subject):JWT的所有者;

  • aud(Audience):JWT的接收对象;

  • exp(Expiration time):JWT的过期时间;

  • nbf(Not Before):JWT的生效开始时间;

  • iat(Issued at):JWT的签发时间;

  • jti(JWT ID):是JWT的唯一标识。

除了以上标准声明以外,我们还可以自定义声明。以 com.auth0 为例,下面代码片段实现了生成一个带有过期时间的token.

String token = JWT.create().withIssuer(ISSUER).withIssuedAt(new Date(currentTime))// 签发时间.withExpiresAt(new Date(currentTime + EXPIRES_IN * 1000 * 60))// 过期时间戳.withClaim("username", username)//自定义参数.sign(Algorithm.HMAC256(user.getPassword()));

其中:

  • withIssuer() 设置签发主体;

  • withIssuedAt() 设置签发时间;

  • withExpiresAt() 设置过期时间戳,过期的时长为 EXPIRES_IN (单位秒);

  • withClaim() 设置自定义参数。

JWT设置了过期时间以后,一定超过,那么接口就不能访问了,需要用户重新登录获取token。如果经常需要用户重新登录,显然这种体验不是太好,因此很多应用会采用token过期后自动续期的方案,只有特定条件下才会让用户重新登录。

token过期的续期方案

解决token过期的续期问题可以有很多种不同的方案,这里举一些比较有代表性的例子。首先我们看一个单token方案,这个方案除了可以实现token续期以外,还可以实现某些条件下的强制重新登录。

单token方案
39d0ef37a2283563bf40115d4622ac62.png
  • 将 token 过期时间设置为15分钟;

  • 前端发起请求,后端验证 token 是否过期;如果过期,前端发起刷新token请求,后端为前端返回一个新的token;

  • 前端用新的token发起请求,请求成功;

  • 如果要实现每隔72小时,必须重新登录,后端需要记录每次用户的登录时间;用户每次请求时,检查用户最后一次登录日期,如超过72小时,则拒绝刷新token的请求,请求失败,跳转到登录页面。

另外后端还可以记录刷新token的次数,比如最多刷新50次,如果达到50次,则不再允许刷新,需要用户重新授权。

上面介绍的单token方案原理比较简单。下面我们再看一个双token方案。

双token方案
  • 登录成功以后,后端返回 access_token 和 refresh_token,客户端缓存此两种token;

  • 使用 access_token 请求接口资源,成功则调用成功;如果token超时,客户端携带 refresh_token 调用token刷新接口获取新的 access_token;

  • 后端接受刷新token的请求后,检查 refresh_token 是否过期。如果过期,拒绝刷新,客户端收到该状态后,跳转到登录页;如果未过期,生成新的 access_token 返回给客户端。

  • 客户端携带新的 access_token 重新调用上面的资源接口。

  • 客户端退出登录或修改密码后,注销旧的token,使 access_token 和 refresh_token 失效,同时清空客户端的 access_token 和 refresh_toke

微信网页授权是通过OAuth2.0机制实现的,也使用了双token方案。

d77f5d6c457887d8cafcfcb662103c4d.png
微信网页授权方案
  • 用户在第三方应用的网页上完成微信授权以后,第三方应用可以获得 code(授权码)。code的超时时间为10分钟,一个code只能成功换取一次access_token即失效。

  • 第三方应用通过code获取网页授权凭证access_token和刷新凭证 refresh_token。

  • access_token是调用授权关系接口的调用凭证,由于access_token有效期(2个小时)较短,当access_token超时后,可以使用refresh_token进行刷新。

  • refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。

后端实现token过期还可以利用Redis来存储token,设置redis的键值对的过期时间。如果发现redis中不存在token的记录,说明token已经过期了。

来源:toutiao.com/article/6995179162675790350

热门内容:
  • 我们公司使用了 6 年的Spring Boot 项目部署方案!打包 + Shell 脚本部署详解,稳的一批!

  • 比 Xshell 还好用的 SSH 客户端神器,MobaXterm 太爱了!

  • 5.4万Star全部归零,项目作者:十分后悔

  • Fastjson 2 来了,性能继续提升,还能再战十年

  • 比 Xshell 还好用的 SSH 客户端神器,MobaXterm 太爱了!

6b166843ce48d55f1751be4f93e0f006.png

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡


http://lihuaxi.xjx100.cn/news/255525.html

相关文章

LeetCode实战:三数之和

题目英文 Given an array nums of n integers, are there elements a, b, c in nums such that a b c 0? Find all unique triplets in the array which gives the sum of zero. Note: The solution set must not contain duplicate triplets. Example: Given array n…

最快下月!地表最强语言模型GPT-4发布在即?CEO暗示:已通过图灵测试

视学算法报道 编辑:Cris【导读】千呼万唤始出来!GPT-4,真要来了?作为史上最受期待的AI模型,GPT-4真要来了?这几天,AI分析师罗梅罗的一篇专栏文章,一经推出便迅速「引爆」了整个AI科…

web 前端常用组件【06】Upload 控件

因为有万恶的IE存在,所以当Web项目初始化并进入开发阶段时。 如果是项目经理,需要知道客户将会用什么浏览器来访问系统。 明确知道限定浏览器的情况下,你才能从容的让手下的封装必要的前端组件。 本篇文章试图从常见的上传方式和组件进行分析…

linux系统管理学习笔记之三----软件的安装

linux系统管理学习笔记之三----软件的安装 2009-12-29 19:10:02标签:linux 系统管理    [推送到技术圈] 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。htt…

js 验证数据类型的4中方法

1.typeof 可以检验基本数据类型 但是引用数据类型(复杂数据类型)无用; 总结 : typeof 无法识别引用数据类型 包括 bull; 2.instanceof是一个二元运算符,左操作数是一个对象,右操作数是一个构造函数。如…

杭电出了“王炸班”!考研3个清北8个浙大,就业人均起薪30万+

Datawhale分享 学霸班:杭州电子科技大学,人工智能学院杭州电子科技大学人工智能学院出了一个学霸“王炸班”,56人中34人考研上岸,17人考上985,8名浙大,2名清华,1名北大。另外,就业的…

4种 Redis 集群方案介绍+优缺点对比

欢迎关注方志朋的博客,回复”666“获面试宝典在服务开发中,单机都会存在单点故障的问题,及服务部署在一台服务器上,一旦服务器宕机服务就不可用,所以为了让服务高可用,分布式服务就出现了,将同一…

Ideas Of MySelf 20005-07-26

crazy0man(事在人为!) 说:常飞 说:(呵crazy0man(事在人为!) 说:我想crazy0man(事在人为!) 说:我们是不是常飞 说:什么常飞 说:?crazy0man(事在人为!) 说:应该打起精神来常飞 说:对呀crazy0man(事在人为&…