当前位置:网站首页>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已经过期了。
相关文章推荐:
边栏推荐
- How to install postgresql and configure remote access in ubuntu environment
- Interviewer: Tell me the difference between NIO and BIO
- 《中国综合算力指数》《中国算力白皮书》《中国存力白皮书》《中国运力白皮书》在首届算力大会上重磅发出
- Fuse bit of AVR study notes
- 物联网应用发展趋势
- 基于 Next.js实现在线Excel
- Install mysql on k8s
- 小 P 周刊 Vol.13
- 按键控制开关4017芯片数字电路
- LM2596有没有可以替代的?LM2576可以
猜你喜欢
随机推荐
Interviewer: Tell me the difference between NIO and BIO
ssm学习心得(完结篇
router---dynamic route matching
FreeConfig.h文件
How to find the location of a pdf file in endnote literature
Kyushu Cloud attended the Navigator Online Forum to discuss the current status, challenges and future of 5G MEC edge computing
【无标题】
idea永久激活教程(新版)
MPLS experiment
国家安全机关对涉嫌危害国家安全犯罪嫌疑人杨智渊实施刑事拘传审查
理论篇1:深度学习之----LetNet模型详解
砺夏行动|九州云章津楠:开源不是少数人的运动,大众化才是源泉
如何查找endnote文献中pdf文件的位置
router---Programmatic navigation
C# 复制列表
metaRTC5.0新版本支持mbedtls(PolarSSL)
如何才能有效、高效阅读?猿辅导建议“因材因时施教”
(记录)异步并发,多线程处理表的统计
异步编程概览
量化细胞内的信息流:机器学习时代下的研究进展









