在文中给出的例子中,仅实现了登录认证,但是并没有设置token的过期韶光,在实际运用中,token一样平常都须要设置过期韶光。
如何设置token的过期韶光前文《Java口试常见问题:JWT是什么?》先容过,JWT token的 payload 部分是一个json串,是要通报数据的一组声明,这些声明被JWT标准称为claims。
JWT标准里面定义的标准claim包括:

除了以上标准声明以外,我们还可以自定义声明。以 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方案
单token方案实现token续期
将 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方案。
微信网页授权
微信网页授权方案
用户在第三方运用的网页上完成微信授权往后,第三方运用可以得到 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已经由期了。
我会持续更新关于物联网、云原生以及数字科技方面的文章,用大略的措辞描述繁芜的技能,也会偶尔揭橥一下对IT家当的意见,请大家多多关注,欢迎留言和转发,希望与大家互动互换,感激。