JWT
JWT是用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。 因为数字签名的存在,这些信息是可信的,JWT使用HMAC算法或者RSA的公司密钥对进行签名
JWT组成
JWT由header,Payload,Signture三部分组成
header
- typ:类型
- alg:算法
Payload:负载,其实就是数据
Signture:签名
const sign=this.sign([header,content].join('.').secret);
sign(str,secret){//签名
return require('crypto').createHmac('sh256',sign).update(str).disget('base64');
}
过程
base64(header).base64(Payload).base64(Signature);
实现
const jwt = {
//编码
encode(payload, secret) {
const header = this.toBase64(JSON.stringify({ typ: 'JWT', alg: 'HS256' }));
const content = this.toBase64(JSON.stringify(payload));
//签名:header.content
const sign = this.sign([header, content].join('.'), secret);
//header.content.sign
return [header, content, sign].join('.');
},
decode(token, secret) {//解码
let [header, content, sign] = token.split('.');
header = JSON.parse(this.fromBase64ToStr(header));
content = JSON.parse(this.fromBase64ToStr(content));
if (sign === this.sign([header, content].join('.')), secret) {
return true;
}
return false;
},
toBase64(str) {//转base64
return Buffer.from(str).toString('base64');
},
sign(str, secret) {//签名
return require('crypto').createHmac('sh256', secret).update(str).digest('base64');
},
fromBase64ToStr(base64) {
return Buffer.from(base64, 'base64').toJSON('utf8');
}
}