用于验证用户,token是由后端生成
1 token使用流程
1.客户端使用用户名跟密码请求登录
2.服务端收到请求,去验证用户名与密码
3.验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户
4.客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 localStorage 里
5.客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
6.服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
2 使用(后端)
2.1 下载
npm install jsonwebtoken
2.2 引入
使用jwt的时候引入
let jwt = require("jsonwebtoken");
2.3 生成token语法
jwt.sign( 用户信息 , 口令 , 过期时间)
在请求接口中生成token,可将token值添加到用户信息的token属性中
//用户信息
let payload = { tel: userTel };
//口令
let secret = "xiaoluxian";
//生成token
let token = jwt.sign(payload,secret,{
expiresIn:60
});
2.4 解析token
在后端请求接口中使用,当我们登录账号后,需要查看个人信息,此使则需要根据token值去获取用户信息,接收前端传过来的token然后解析获取用户tel,再根据查询渲染到页面
jwt.decode(token);
//得到token值
let token = req.headers.token;
//解析token,获取用户信息
let tokenObj = jwt.decode(token);
函数:当前时间-生成token时间判断
function getTimeToken(exp){
let getTime=parseInt(new Date().getTime()/1000)//获取当前时间戳
if(getTime-exp>60){
return true
}
}
在购物车中判断是否过期,若过期则返回1000,则需重新登录(axios二次封装中若返回值为1000则跳转到登录界面重新登录)
axios二次封装加入判断token是否过期
若token有过期时间,在每次登录都需更新token
//密码登录
router.post("/api/login", function (req, res, next) {
// res.send({ data: { code: 2 } });
//后端要接收前端传递过来的值
let params = {
userTel: req.body.userTel,
userPwd: req.body.userPwd,
};
// //用户信息
let payload = { tel: params.userTel };
// //口令
let secret = "xiaoluxian";
// //生成token
let token = jwt.sign(payload, secret, {
expiresIn: 60,
});
//查询用户手机号是否存在
connection.query(user.queryUserTel(params), function (error, results) {
//手机号存在
if (results.length > 0) {
//用户记录id
let id = results[0].id;
connection.query(user.queryUserPwd(params), function (err, result) {
if (result.length > 0) {
//更新token
connection.query(
`update user set token='${token}' where id=${id}`,
function (err, r) {
//手机号和密码都对
res.send({
code: 200,
data: {
success: true,
msg: "登录成功",
data: result[0],
},
});
}
);
} else {
//密码不对
res.send({
code: 302,
data: {
success: false,
msg: "密码不正确",
},
});
}
});
} else {
//不存在
res.send({
code: 301,
data: {
success: false,
msg: "手机号不存在",
},
});
}
});
});