先了解下几个名词:
- UUID:通用唯一识别码,绝对不会重复的字符串。不同版本UUID的区别。
传统的基于token的认证
众所周知,在用户登录验证时,服务端验证用户名密码是否正确,如果验证通过,则生成一个token发送给用户,同时保存这个token到数据库。
JWT
用户登录,服务端返回一个token,但是服务端不保存这个token。
以后用户再来访问,需要携带token,服务端基于算法校验token。
JWT实现过程
看一下一个JWT长什么样(这是一句,由3段组成,中间小数点隔开,为了直观,我在小数点处换行)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
第1、2段是通过base64url编码的,base64url解码结果如下:
atob('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9')
得到 "{"alg":"HS256","typ":"JWT"}"
atob('eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ')
得到 "{"sub":"1234567890","name":"John Doe","iat":1516239022}"
第3段就有些不同,它的生成步骤如下:
将第1、2段拼接起来;
将拼接结果进行加密,加密方法看第一段中有写,这里是HS256,可以加盐;
对HS256加密后的密文再进行base64url编码。
校验流程
用户再访问时,如何校验JWT?
1. 获取token
从请求体中取出token。
2. 切割token,进行base64url解码,获取信息
从header(第1段)中得到加密算法类型,这里假设是HS256。
从payload(第2段),一般我们在最初生成token时会带上token的过期时间戳,这里我们检查下过期了没,如果过期了则直接拒绝请求。
3. 校验token是否有效
第3段是用来校验token的,我们把进行
HS256(
base64Url编码(header) + '.' +
base64Url编码(payload),
我加的盐
)
理论上得到的结果应该与第3段完全一致,如果不一致则说明token无效,拒绝请求。