token的生成解析及过期时间

836 阅读2分钟

用于验证用户,token是由后端生成

1 token使用流程

1.客户端使用用户名跟密码请求登录
2.服务端收到请求,去验证用户名与密码
3.验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户
4.客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 localStorage5.客户端每次向服务端请求资源的时候需要带着服务端签发的 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
	});

image.png

image.png

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则跳转到登录界面重新登录)

image.png axios二次封装加入判断token是否过期 image.png

若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: "手机号不存在",
        },
      });
    }
  });
});