实现JWT(JSON Web Tokens)生成Token的自动续期,我们要知道刷新令牌(Refresh Token)和访问令牌(Access Token)的概念。刷新令牌的有效期长,访问令牌的有效期短。刷新令牌顾名思义,就是用来刷新访问令牌的。我们登录用户时,我们服务端(后端)会一次性生成刷新令牌和访问令牌两个Token。
下面说一下具体怎么操作实现
**1.生成访问令牌和刷新令牌
当用户登录成功时,同时生成访问令牌和刷新令牌,访问令牌用于访问受保护的资源的“钥匙”,刷新令牌是在访问令牌过期后获取新的访问令牌。
##注意:刷新令牌的有效期不要过长,但也不要过短。7天,10天都行。访问令牌的有效期保证短期有效就行,30分钟,1小时。
**2.存储令牌
不仅服务端(后端)要存储生成的刷新令牌,一般存储到数据库,而且生成的访问令牌和刷新令牌也都要返回给客户端(前端),客户端(前端)也都要安全存储起来,以备后续使用。在调用受保护的服务端(后端)接口资源时,我们用访问令牌去访问。
**3.后端验证令牌有效性
客户端(前端)用访问令牌请求接口时,服务端(后端)验证该访问令牌的有效性,合法性,若有效,则接着后续请求数据。若验证访问令牌过期,这时候服务端(后端)返回特定错误code,一般是401。客户端(前端)拿到这个code后,在客户端(前端)做处理,重新使用已存储的刷新令牌再去请求服务端(后端)的接口资源。
**4.刷新令牌获取新的访问令牌
调用刷新令牌的接口,服务端(后端)在验证时,先向数据库查询刷新令牌,如果查不到就报错:刷新令牌不存在;如果查得到,再判断是否过期,如果过期,则返回token已过期,如果没过期,则会向授权服务器(OAuth2.0)发送刷新令牌请求。
***参数格式:grant_type:固定为“refresh_token”,表示使用刷新令牌来获取新的访问令牌。
refresh_token:客户端(前端)传的刷新令牌。
授权服务器会发放一个新的访问令牌和一个新的刷新令牌,返回参数:
***access_token:新的访问令牌
refresh_token:新的刷新令牌(我们这个也可以自己加验证, 刷新令牌快过期时再用心的)
拿到新的访问令牌,返回给客户端(前端),客户端(前端)再次发从包含新的访问令牌的请求。这时候就实现了访问令牌的自动续期。
**提示:如何判断过期(或者快过期)调用刷新令牌更新访问令牌细节(OAuth2.0 token有效期和生成token时间都是时间戳,所以后续比较是拿时间戳比较):
过期后再刷新令牌的话,我们要生成token时,把生成token的时间也要存起来。这样每次调用接口时,服务端(后端)验证时会计算 当前时间(也就是调用接口时间)- 获取token的时间,如果大于该访问令牌的有效期,那么就调用刷新令牌接口。
快过期的话,我们服务端(后端),要设置一个阈值,验证的时候用令牌的有效期 - 当前时间,得到的值和阈值比较。
**防患于未然
有可能刷新令牌会被盗用,这时候就很危险了,所以我们要用授权服务的监控机制和撤销令牌的机制来保证安全;我们也可以限制刷新令牌的使用次数,使用一次,就更换刷新令牌,这样也从另一种角度确保了安全。
**Ending
这节可能比较枯燥,而且没代码实现。但是流程讲的很细了,如果在引入OAuth2.0服务或者其他步骤有问题,可以评论发出来。可能我配的时候很顺,没遇到,但是这可能确实是个坑,分享出来利人利己。
这节就到这啦,再见,每天进步一点,不做摆烂人!
版权归原作者 进击的编程阿伟 所有, 如有侵权,请联系我们删除。