事情是这样的:咱们作了一个小程序,在与后端 Api 交互的过程当中总要带上个
token
。然而这个token
过了两小时就失效,so 咱们虽然作了处理了失效的逻辑,可是怎么模拟失效的token
呢,这一切都要从JWT提及...html
JWT,JSON Web Token。通常用于 OAuth 2.0 鉴权系统中,由三部分组成,用 .
拼接:算法
header
定义 jwt 以及算法类型payload
真正发送的数据signature
由 header 与 payload 用算法生成的签名你看到的一个jwt
多是这样的:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NTM1MDQzNTc5MTgsInVzZXIiOiJ0YW8iLCJzZXgiOjB9.Rg6jvDV2EMqtPQc2d4krpAUYC-hMtc54vSsZAuCxuKQjson
header
格式:小程序
{
"typ": "JWT",
"alg": "HS256"
}
复制代码
type 固定为JWT
;algorithm 表示使用的算法,经常使用的有HS256
(sha-256)、RS256
(rsa-256)等等后端
payload
(无格式,推荐 json 形式)ui
{
"exp": 1553504357918,
"user": "tao"
}
复制代码
expire 指明了此 token 的有效时间,除此以外 RFC 还规范了其它几个字段好比说iss
(issuer 生成者)、iat
(issued at 生成时间)、jti
(JWT ID 惟一标识)编码
signature
生成方式: 将header
与payload
编码成 base64,再用.
拼接成一个字符串,最后经过 Hmac(hash-based message authentication code) 算法生成spa
hmac 与哈希算法的区别就是多了个 secret key,因此它也叫 keyed-hasing
注意:payload 中不该该放入敏感数据,诸如用户密码之类。由于它能直接被解码debug
const crypto = require('crypto');
// 固定格式
const header = {
typ: 'JWT',
alg: 'HS256',
};
// 须要传输的数据,也能够是一段字符串
const payload = {
exp: 1553504357918,
user: tao
};
const arr = [];
// 签名所用秘钥
const secret = 'Zeus';
// 编码 header 与 payload
arr.push(Buffer.from(JSON.stringify(header)).toString('base64'));
arr.push(Buffer.from(JSON.stringify(payload)).toString('base64'));
// 用 . 拼接,获得:
// eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NTM1MDQzNTc5MTgsInVzZXIiOiJ0YW8ifQ
const encodeStr = arr.join('.');
// 生成 signature
const signature = crypto
.createHmac('sha256', secret)
.update(encodeStr)
.digest('base64');
arr.push(signature);
// 最后生成的 JWT:
// eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NTM1MDQzNTc5MTgsInVzZXIiOiJ0YW8iLCJzZXgiOjB9.Rg6jvDV2EMqtPQc2d4krpAUYC-hMtc54vSsZAuCxuKQ
arr.join('.');
复制代码
目前 OAuth 2.0 以 JWT 形式生成的 token 比较主流,能够了解一下~3d