故心故心故心故心小故冲啊
1.生成jwt并返回
生成jwt
getJwt: function (data) {
return jwt.sign(data, constant.secret, {
expiresIn: '1d' //单位 毫秒 1d-1天
})
},
返回前端
//生成jwt的数据
var d = {
id: data.id,
account: data.account,
};
//生成jwt
let token = userCtrl.getJwt(d);
resp.json({ code: 200, data: data, token: token });
2.权限验证(令牌token)
token判断
1.判断是否为预请求 =>放行
2.判断时候在登录url =>放行
3.如果请求头有token =>解钥 =>token无效(自己操作的) token有效 =>过期了 token正确=> 放行
4.无token =>请登录
var checkLogin = (req, res, next) => {
//跨域试探 预请求
if (req.method === 'OPTIONS') {
resp.send({})
} else if (req.originalUrl === '/api/user/login') {
next();
} else if (req.headers.hasOwnProperty("token")) {
// 解钥
jwt.verify(req.headers.token, constant.secret, function (err, decode) {
if (err) {
// token无效(自己操作的)
if (err.name === 'JsonWebTokenError') {
console.log(err.name)
res.send("token无效,请重新登录")
}
// token有效 =>过期了
if (err.name === 'TokenExpiredError') {
// 若token刚过期且还在使用 需要重新生成新token
// 过期时间(分钟)=现在时间-过期时间
//new.Data().getTime()现在时间的时间戳
//err.expiredAt.getTime() 过期的时间戳
//(1000*60) /1000转化为秒 /60转为分
//toFixed(2) 保留2位小数
let expiredTime = ((new Date().getTime() - err.expiredAt.getTime()) / (1000 * 60)).toFixed(2);
// console.log(new Date().getTime());
// console.log(err.expiredAt.getTime());
if (expiredTime <= 30) {
//前端code==20002表示要更新token
res.send("生成新token,请客户端更新token")
} else {
res.send("token过期了!请重新登录!")
}
}
} else {
//解钥没有问题 token正确=> 放行
next();
}
})
} else {
res.send("没有token,请重新登录")
}
}
app.use(checkLogin);