点击上方蓝色字体,选择“设为星标”
回复”学习资料“获取学习宝典
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的唯一标识。除了以上标准声明以外,我们还可以自定义声明。以 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的次数,比如最多刷新50次,如果达到50次,则不再允许刷新,需要用户重新授权。
上面介绍的单token方案原理比较简单。下面我们再看一个双token方案。
access_token
和 refresh_token
,客户端缓存此两种token;access_token
请求接口资源,成功则调用成功;如果token超时,客户端携带 refresh_token
调用token刷新接口获取新的 access_token
;refresh_token
是否过期。如果过期,拒绝刷新,客户端收到该状态后,跳转到登录页;如果未过期,生成新的 access_token
返回给客户端。access_token
重新调用上面的资源接口。access_token
和 refresh_token
失效,同时清空客户端的 access_token
和 refresh_toke
。微信网页授权是通过OAuth2.0机制实现的,也使用了双token方案。
后端实现token过期还可以利用Redis来存储token,设置redis的键值对的过期时间。如果发现redis中不存在token的记录,说明token已经过期了。
来源:toutiao.com/article/6995179162675790350
------------- END -------------扫描下方二维码,加入技术群。暗号:加群