当前位置:网站首页>How to automatically renew the token after it expires?
How to automatically renew the token after it expires?
2022-08-04 14:16: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续期以外,还可以实现Forced re-login under certain conditions.
1.1 单token方案

- 将 token 过期时间设置为15分钟;
- 前端发起请求,后端验证 token 是否过期;如果过期,前端发起刷新token请求,后端为前端返回一个新的token;
- 前端用新的token发起请求,请求成功;
- 如果要实现每隔72小时,必须重新登录,后端需要Record the login time of each user;用户每次请求时,检查用户最后一次登录日期,如超过72小时,则拒绝刷新token的请求,请求失败,跳转到登录页面.
Also the back end is fine记录刷新token的次数,比如最多刷新50次,如果达到50次,则不再允许刷新,需要用户重新授权.
上面介绍的单token方案原理比较简单.下面我们再看一个双token方案.
1.2 双token方案
登录成功以后,后端返回 access_token 和 refresh_token,客户端cache bothtoken;
使用 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是The calling credentials for calling the authorization relationship interface,由于access_token有效期(2个小时)较短,当access_token超时后,可以使用refresh_token进行刷新.
refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权.
后端实现token过期还可以利用Redis来存储token,设置redis的键值对的过期时间.如果发现redis中不存在token的记录,说明token已经过期了.
相关文章推荐:
边栏推荐
- [Opportunity Enlightenment-60]: "Soldiers, Stupid Ways"-1- Opening: "Death" and "Life" are the way of heaven
- 异步编程概览
- Crawler - action chain, xpath, coding platform use
- 没有Project Facets的解决方法
- 并发程序的隐藏杀手——假共享(False Sharing)
- FreeConfig.h文件
- (记录)异步并发,多线程处理表的统计
- 谷歌插件.crx文件下载后被自动删除的解决方法
- Set partition minimum difference problem (01 knapsack)
- NPDP|作为产品经理,如何快速提升自身业务素养?
猜你喜欢

Theory 1: Deep Learning - Detailed Explanation of the LetNet Model

Execution failed for task ‘:xxx:generateReleaseRFile‘.

考研上岸又转行软件测试,从5k到13k完美逆袭,杭州校区小哥哥拒绝平庸终圆梦!

idea永久激活教程(新版)

从理论到实践:MySQL性能优化和高可用架构,一次讲清
将 Sentinel 熔断限流规则持久化到 Nacos 配置中心

"C pitfalls and pitfalls" reading summary

中大型商业银行堡垒机升级改造就用行云管家!必看!

四平方和,激光炸弹

并发程序的隐藏杀手——假共享(False Sharing)
随机推荐
记录都有哪些_js常用方法总结
Crawler - action chain, xpath, coding platform use
xpath获取带命名空间节点注意事项
职场漫谈:为什么越是内卷的行业越有人争着抢着往里冲?好奇怪的说...
C# 动态加载卸载 DLL
量化细胞内的信息流:机器学习时代下的研究进展
如何才能有效、高效阅读?猿辅导建议“因材因时施教”
爬虫——selenium基本使用、无界面浏览器、selenium的其他用法、selenium的cookie、爬虫案例
Set partition minimum difference problem (01 knapsack)
odoo15 大部分模块都用的附件整理成一独立模块
中大型商业银行堡垒机升级改造就用行云管家!必看!
leetcode 48. Rotate Image (Medium)
B.构造一个简单的数列(贪心)
metaRTC5.0新版本支持mbedtls(PolarSSL)
理论篇1:深度学习之----LetNet模型详解
电子行业MES管理系统有哪些特殊功能
Rust from entry to proficient 04-variables
php中的ceil和floo以及round函数「建议收藏」
第四讲 SVN
js深拷贝和浅拷贝具体使用区别_es6深拷贝和浅拷贝