前言
看客们对于JWT,我估计大部分都是很熟悉的了。 但是不乏也存在初学者刚接触JWT,那么咱们走个流程,我先简单的在前言里介绍下JWT,因为该篇文章目的不是做JWT的使用介绍。
简单了解JWT
简单来讲,可以把JWT当作是一个写好的生成token令牌(字符串)的方法,使用JWT,就会生成 一个token 字符串。
说白了,就是一个签名的生成规则算法。
JWT生成的token示例:
eyJhbGciOiJIUzUxMiJ9.eyJ1c2VySWQiOiIxMDAxIiwiaXNzIjoiSkNjY2MiLCJpYXQiOjE2MDU2Nzg0MTd9.5f8JwZoi1okX1mEmWDOt6YsZXrxtle52PsjZ92F2I0KBlOG3XRtoL9Tfx0TjQGdwbHzYhV_uz7aNDF0E_I1FPw
咋一看感觉,很长很乱,加密得非常复杂。
那么我们加点颜色再看看:
没错,每一段不同颜色的字符串之间 可以看到,使用了符号 ’ . ‘ 进行了拼接。 一共三段字符串分别是 header 、payload、signature,组成了 所谓的 token令牌。
header : 存储着该令牌使用的加密算法标识信息
payload :存储着 我们放进令牌里面的数据信息
signature :签名
最后再简单看一张图:
大家从图中可以看到我们很熟悉的 base64 , 大家明白 base64 不是一种加密算法, 而仅是一种编码转换方式而已。
也就是说,header 和 payload 这两部分 是可以随意解码的。
就以目前这个token令牌字符串来看,我们解码看看:
ps: 所以到这你能明白所谓的token为什么我说当作一个签名的生成的规则算法看待就行了。
正文
前面介绍太啰嗦了,该篇其实并不是个JWT使用普及文章,是想埋怨一下 注意点。
① 让 JWT-TOKEN 当场失效:
1. 账号注销/登录注销
用户在客户端登录了账号,请求授权, 拿到了 JWT-TOKEN 。
用户选择注销登录(或者账号被注销),那么讲道理其实之前的JWT-TOKEN 应该是无效的了。
2.修改密码
用户在客户端登录了账号,请求授权, 拿到了 JWT-TOKEN 。
用户修改了密码,那么讲道理其实之前的JWT-TOKEN 应该是无效的。
3.修改资源权限信息
有些情形我们会选择在JWT-TOKEN 使用自定义Claims,在Claims里面放入 role(角色),permission(权限)等数据。
用户的 role(角色),permission(权限) 一旦被修改, 那么讲道理其实之前的JWT-TOKEN 应该是无效的了。
类似上面举例的这种情形,
JWT是无法提供这种售后服务的, 没有办法直接指定某个JWT-TOKEN ,使其当场失效。
那么也就是说,如果这个JWT-TOKEN 被人拎出来,在有效期内去使用,那么这个令牌就还是有用的。
所以对于这种场景我们的方案是:
使用 redis 去缓存 授权颁发的JWT-TOKEN , 通过在redis 中去管理 是否删除(失效)JWT-TOKEN 。
可是这么一来,其实也就不是 所谓的无状态了。
因为原本很多人选择使用token,就是想脱离session 这种服务有状态的模式。想让前端自己保存token,后端不需要花费精力去管理。一旦加入redis,其实可以理解为又回到了原点。
只是说在一个方面上直接避免了session的一些问题。
②延长token时间、刷新token:
token快过期了或者过期了,我想刷新续签一下。让这个token 再次获得生命!
JWT只会给你一个新的token。
需要我们自己去合理选择刷新token与客户端协作的方案,无感知刷新、新旧token交替等等。