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;