最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

【全球时快讯】node借助jsonwebtoken生成token以及验证token是否过期

来源:博客园


(资料图片仅供参考)

生成token使用 jsonwebtoken 插件

我当时使用的版本"jsonwebtoken": "^9.0.0",cnpm i  jsonwebtoken -S

登录后生成token

//routes/index.js文件var express = require("express");//引入jsonwebtoken, 用它来生成token的var jwt = require("jsonwebtoken")var router = express.Router();//定义秘钥const secret = "20230116zhouyi"// 登录router.post("/login", function (req, res) {  let { username, password } = req.body  // 1.构造SQL语句。  const sqlStr = `select * from account where username= "${username}" and password="${password}"`  connection.query(sqlStr, (err, data) => {    if (err) {      throw err    } else {      if (!data.length) {        res.send({          code: 1,          msg:"请检查用户名或者密码"        });      } else if(data.length==1){ //如果查询出是2,仍然登录失败        let results = JSON.stringify(data);//把results对象转为字符串,去掉RowDataPacket        let obj = JSON.parse(results);//把results字符串转为json对象        //生成token        // jwt.sign(obj,secret,{expiresIn:}) 第一个参数obj是加密的对象        // 第二个参数secret是加密的秘钥        // 第三个参数 过期的时间单位是s         const token=jwt.sign(obj[0],secret, { expiresIn: 10 })        console.log("token",token)        res.send({          code: 0,          msg: "恭喜你登录成功12",          username: data.username,          backtoken:"Bearer "+token        });      } else {        res.send({          code: 3,          msg:"请检查用户名或者密码"        });      }    }  })});

为什么生成的 token 要加"Bearer "原因是因为规范

使用 express-jwt 检查是否携带了token

首先下载express-jwt 我当时使用的是 : "express-jwt": "^8.3.0"cnpm i  express-jwt -S

app.js中-验证是否携带了token

//按需引入 var { expressjwt } = require("express-jwt");// 验证接口是否携带了token,初了 /login/login 接口外不需要携带token,其它接口都需要app.use(expressjwt({secret:secret,algorithms:["HS256"]}).unless({path:["/login/login"]}))//定义秘钥const secret = "20230116zhouyi"// 这个是错误级别的中间件--用来捕获错误的app.use(function (err, req, res, next) {  // set locals, only providing error in development  res.locals.message = err.message;  res.locals.error = req.app.get("env") === "development" ? err : {};   // render the error page  res.status(err.status || 500);  //  res.render("error"); 这个是原来的我现在注释掉了  console.log("触发了错误级别的中间件",err)  if (err) {    res.send({      code: 4,      msg:err    });  }});

在10s内点击可以正常的返回数据在10s后返回点击出现

为什么会出现这样的情况

我都还没有验证token是否过期,为啥就出现了 token过期呢?因为你虽然没有验证token是否过期,但是你在全局错误中间件中捕获了。它捕获到了过期,所以会出现

使用jsonwebtoken验证token是否过期

1. 下载jsonwebtoken
// app.jsvar { expressjwt } = require("express-jwt");const jwt = require("jsonwebtoken");//定义秘钥const secret = "20230116zhouyi"// 这个是错误级别的中间件--用来捕获错误的app.use(function (err, req, res, next) {  // set locals, only providing error in development  res.locals.message = err.message;  res.locals.error = req.app.get("env") === "development" ? err : {};   // render the error page  res.status(err.status || 500);  //  res.render("error"); 这个是原来的  console.log("触发了错误级别的中间件",err)  if (err) {    res.send({      code: 4,      msg:err    });  }  // 下面的代码是验证token是否过期  let headers = req.headers  let token=headers["authorization"].split(" ")[1]  //全局验证token是否过期  jwt.verify(token, secret, (err, payload) => {    if (err) res.sendStatus(403)    res.json({ message:"认证成功", payload })  })  // 验证token过期的代码结束});

关键词: 这样的情况 登录成功 时间单位