jwt的封装

let crypto = require('crypto');//引入加密程序

const SECRET = 'xxxxxx';//密钥 

 

class JWT {

    constructor(time=0,user='user') {//time为过期时间,单位是小时(number)

        this.header=this.GeneratorHeader();

        this.payload=this.Generatorpayload(time,user)

    }

    //产生header

    GeneratorHeader(){

        return {

            'typ': 'JWT',

            'alg': "hs256"

        }

    }

    Generatorpayload(time,user){

        return {

            sub : user,//面向的用户

            exp : Date.now() + 1000 * 60 * 60 * time,//过期时间

            iat : Date.now() //当前签发时间

        }

    }

    //base64编码字符串转对象

    base64ToJson(str) {

        let buf = Buffer.from(str, 'base64');

        let utf8_str = buf.toString('utf8')

        return JSON.parse(utf8_str)

    }

    //base64编码字符串转对象

    JsonTobase64(obj) {

        let buf = Buffer.from(JSON.stringify(obj));

        return buf.toString('base64')

    }

    // HMAC SHA256加密算法

     HS256(signature) {

        let hmac = crypto.createHmac('sha256', SECRET)//引入加密算法以及密钥

        hmac.update(signature)

        return hmac.digest('base64')

    }

    //生成JWT字符串

    GeneratorJwt() {

        let base64_header = this.JsonTobase64(this.header)

        let base64_payload = this.JsonTobase64(this.payload)

        let signature = `${base64_header}.${base64_payload}`

        // signature这个部分需要base64编码后的header和base64编码后的payload使用.连接组成的字符串,然后通过header中声明的加密方式(alg:hs256)进行加密,然后就构成了jwt的第三部分。

        signature = this.HS256(signature)

        return `${base64_header}.${base64_payload}.${signature}`

    }

    //检测jwt ,验证合法性

    /*

    验证的逻辑为:将用户提供的jwt字符串通过split方法分离为header,payload,signature三个部分;按照jwt的生成规则,我们把header和payload再次使用密钥加密生成为真正的signature;把真正的signature和分离出来signature进行比对,如果一致则表示该jwt没有被篡改,合法有效

    然后在jwt合法的基础上;将payload通过base64ToJson转换为对象;判断里面的exp过期时间是否已过期,过期表示身份过期过期失效

    */

    checkJwt(jwt) {

        // 

        let [header = '', payload = '', signature = ''] = jwt.split('.')

        let real_signature = `${header}.${payload}`

        real_signature = this.HS256(real_signature)

        if (real_signature == signature) {

            payload = this.base64ToJson(payload)

            let { exp,sub } = payload;

            if (exp < Date.now()) {

                return {code:200,msg:'身份过期',result:null};

            }

            return {code:200,msg:'验证成功',result:{sub}}

        }

        else {

            return {code:201,msg:'验证失败',result:null}

        }

    }

}

let jwt=new JWT(2,'jack');

 

let str=jwt.HS256('Asdf12345');

console.log(str);

// let str=jwt.GeneratorJwt()

// console.log(str);

// console.log(jwt.checkJwt(str));

module.exports=JWT;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值