传统的用户认证cookie和session认证·
1 | sequenceDiagram |
缺点
- 不同服务器之间不能共享session
解决方法
- session持久化,写入数据库,但是缺点是工程量大
- 服务器不保存session数据,全部保存客户端现在的jwt
jwt数据结构
- Header(头部)
- Payload(负载)
- Signature(签名)
header
头部一般是json对象,描述jwt的算法和令牌类型,都通过base64加密
1 | { |
payload
json对象,用来存放需要传递数据,jwt规定7个官方字段
1 | iss (issuer):签发人 |
除此之外还可以定义私有字段,默认不加密,不要放密码,例如
1 | { |
Signature
是对前两部分的签名,指定一个密钥,密钥只有服务器能够使用
node的jwt验证
过程
1.前端发送账号密码之后
2.后端通过插件生成token
3.前端请求携带token
4.后端判断token有效期
本操作步骤,是在express脚手架下进行的,请自行安装
首先下载jsonwebtoken插件
1 | npm i jsonwebtoken -s |
1 | var jwt=require("jsonwebtoken") |
官网中定义的jwt.sign语法
1 | jwt.sign(payload, secretOrPrivateKey, [options, callback]) |
payload
可以是表示有效 JSON 的对象文字、缓冲区或字符串。secretOrPrivateKey
是一个字符串、缓冲区或对象,其中包含 HMAC 算法的秘密或 RSA 和 ECDSA 的 PEM 编码私钥,我用于混淆tokenoptions
常用:algorithm
(默认HS256
:)expiresIn
: 如果不写单位默认为毫秒 (days, hours, etc)
1 | //登陆后校验token |
校验语法
1 | jwt.verify(token, secretOrPublicKey, [options, callback]) |
- token就是前端传过来的token,一般会带上bearer,通过处理取到后面的token
参考链接
http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html