jwt实现逻辑

215 阅读1分钟

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');
    }
}