当前位置:网站首页>token 过期后,如何自动续期?
token 过期后,如何自动续期?
2022-08-04 14:08:00 【ZNineSun】
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的唯一标识。
除了以上标准声明以外,我们还可以自定义声明。下面代码片段实现了生成一个带有过期时间的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过期后自动续期的方案,只有特定条件下才会让用户重新登录。
1.token过期的续期方案
解决token过期的续期问题可以有很多种不同的方案,这里举一些比较有代表性的例子。
首先我们看一个单token方案,这个方案除了可以实现token续期以外,还可以实现某些条件下的强制重新登录。
1.1 单token方案
- 将 token 过期时间设置为15分钟;
- 前端发起请求,后端验证 token 是否过期;如果过期,前端发起刷新token请求,后端为前端返回一个新的token;
- 前端用新的token发起请求,请求成功;
- 如果要实现每隔72小时,必须重新登录,后端需要记录每次用户的登录时间;用户每次请求时,检查用户最后一次登录日期,如超过72小时,则拒绝刷新token的请求,请求失败,跳转到登录页面。
另外后端还可以记录刷新token的次数,比如最多刷新50次,如果达到50次,则不再允许刷新,需要用户重新授权。
上面介绍的单token方案原理比较简单。下面我们再看一个双token方案。
1.2 双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_token。
微信网页授权是通过OAuth2.0机制实现的,也使用了双token方案。
2.微信网页授权方案
用户在第三方应用的网页上完成微信授权以后,第三方应用可以获得 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已经过期了。
相关文章推荐:
边栏推荐
猜你喜欢
南瓜科学产品升级 开启益智探索新篇章
物联网应用发展趋势
nVisual secondary development - Chapter 2 nVisual API operation guide Swagger use
小 P 周刊 Vol.13
[Niu Ke brush questions-SQL big factory interview questions] NO5. Analysis of a treasure store (e-commerce model)
AVR学习笔记之熔丝位
职场漫谈:为什么越是内卷的行业越有人争着抢着往里冲?好奇怪的说...
eyb:JWT介绍
相似文本聚类与调参
ICML 2022 | 图神经网络的局部增强
随机推荐
PAT甲级:1040 Longest Symmetric String
爬虫——selenium基本使用、无界面浏览器、selenium的其他用法、selenium的cookie、爬虫案例
工具函数---字符串处理
Win11快速助手在哪里?Win11打开快速助手的方法
量化细胞内的信息流:机器学习时代下的研究进展
Redis 复习计划 - Redis主从数据一致性和哨兵机制
"Social Enterprises Conducting Civilian Personnel Training Specifications" group standard on the shelves of Xinhua Bookstore
让Web页面中的编辑器支持黏贴或直接拖拽来添加图片「建议收藏」
router---mode
MPLS experiment
js深拷贝和浅拷贝具体使用区别_es6深拷贝和浅拷贝
Oracle RAC环境下vip/public/private IP的区别
开发者独立搭建一个跨模态搜索应用有多难?
【模型部署与业务落地】基于量化芯片的损失分析
How to play the Tower of Hanoi
Chinese valentine's day, of course, to learn SQL optimization better leave work early to find objects
leetcode 48. Rotate Image 旋转图像(Medium)
idea permanent activation tutorial (new version)
数据库的基本概念
如何才能有效、高效阅读?猿辅导建议“因材因时施教”