JWT token的 payload 部分是一个json串,是要传递数据的一组声明,这些声明被JWT标准称为claims。
iss(Issuser):JWT的签发主体;
sub(Subject):JWT的所有者;
aud(Audience):JWT的接收对象;
exp(Expiration time):JWT的过期时间;
nbf(Not Before):JWT的生效开始时间;
iat(Issued at):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 (单位秒);
JWT设置了过期时间以后,一定超过,那么接口就不能访问了,需要用户重新登录获取token。如果经常需要用户重新登录,显然这种体验不是太好,因此很多应用会采用token过期后自动续期的方案,只有特定条件下才会让用户重新登录。
解决token过期的续期问题可以有很多种不同的方案,这里举一些比较有代表性的例子。首先我们看一个单token方案,这个方案除了可以实现token续期以外,还可以实现某些条件下的强制重新登录。
将 token 过期时间设置为15分钟;
前端发起请求,后端验证 token 是否过期;如果过期,前端发起刷新token请求,后端为前端返回一个新的token;
前端用新的token发起请求,请求成功;
如果要实现每隔72小时,必须重新登录,后端需要记录每次用户的登录时间;用户每次请求时,检查用户最后一次登录日期,如超过72小时,则拒绝刷新token的请求,请求失败,跳转到登录页面。
另外,关于更多token相关面试题,公众号Java精选,回复java面试,获取面试资料。
另外后端还可以记录刷新token的次数,比如最多刷新50次,如果达到50次,则不再允许刷新,需要用户重新授权。
登录成功以后,后端返回 access_token 和 refresh_token,客户端缓存此两种token;
使用 access_token 请求接口资源,成功则调用成功;如果token超时,客户端携带 refresh_token 调用token刷新接口获取新的 access_token;
后端接受刷新token的请求后,检查 refresh_token 是否过期。如果过期,拒绝刷新,客户端收到该状态后,跳转到登录页;如果未过期,生成新的 access_token 返回给客户端。
客户端携带新的 access_token 重新调用上面的资源接口。
用户在第三方应用的网页上完成微信授权以后,第三方应用可以获得 code(授权码)。code的超时时间为10分钟,一个code只能成功换取一次access_token即失效。
第三方应用通过code获取网页授权凭证access_token和刷新凭证 refresh_token。
access_token是调用授权关系接口的调用凭证,由于access_token有效期(2个小时)较短,当access_token超时后,可以使用refresh_token进行刷新。
后端实现token过期还可以利用Redis来存储token,设置redis的键值对的过期时间。如果发现redis中不存在token的记录,说明token已经过期了。
作者:微说互联网
https://www.toutiao.com/article/6995179162675790350
公众号“大咖笔记”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!
精品资料,超赞福利!
>Java精选面试题<
3000+ 道 BAT 大厂面试题在线刷,最新、最全 Java 面试题!
放弃 JDK8 中 StringBuilder,使用 StringJoiner 辅助类,真香!
推荐 IntelliJ IDEA 15 款超神级插件(自用,真的超级牛掰)
技术交流群!
最近有很多人问,有没有读者交流群!想知道如何加入?方式很简单,兴趣相投的朋友,只需要点击下方卡片,回复“加群”,即可无套路入交流群!
文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)