首页 > 编程语言 >node借助jsonwebtoken生成token以及验证token是否过期

node借助jsonwebtoken生成token以及验证token是否过期

时间:2023-01-28 23:12:38浏览次数:38  
标签:node err 过期 res jwt token jsonwebtoken

生成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.js
var { 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过期的代码结束
});

标签:node,err,过期,res,jwt,token,jsonwebtoken
From: https://www.cnblogs.com/IwishIcould/p/17071470.html

相关文章

  • 运行npm出错 Error: Cannot find module 'D:\Program Files\nodejs\node_modules\
    运行npm时出错,Error:Cannotfindmodule'D:\ProgramFiles\nodejs\node_modules\npm\bin\npm-cli.js'解决:重新打开node.js安装程序修复(Repair)就可以了。......
  • 安装配置node.js和npm
    一、安装nodejs环境运行官网下载的【.msi】安装包,全部默认下一步,完成安装。执行命令行node-v验证是否安装成功。二、更改npm默认安装路径在【nodejs】根目录,新建......
  • 安装旧版本node.js
    〇、安装条件已经安装了最新版本的node.js一、下载对应版本的node.jshttps://nodejs.org/zh-cn/download/releases/node网站的设计和一般下载软件的页面不一样,不是向下......
  • Nodejs 对接支付宝沙箱
    一.开启沙箱没注册过的 ​​支付宝开放平台​​已有账号可以访问开发者中心 ​​登录-支付宝​​进行认证后,即可进入沙箱配置页二.配置密钥1,下载地址 ​​生成密......
  • 成功解决:npm 版本不支持node.js。【 npm v9.1.2 does not support Node.js v16.6.0.】
    文章目录​​1、出现的问题​​​​2、查看自己的npm和node版本​​​​3、解决方法​​​​3.1寻找对应的版本​​​​3.2升级npm版本​​​​4、再次运行项目,成功​​​......
  • C#中使用 CancellationToken 取消异步任务
    .NET提供了一个类方便用来发出操作取消的信号,这个类就是CancellationToken,它的好处在于它可以在任意数量的线程之间、线程池任务之间、Task之间传递信号,并且所需的代码很......
  • PHP获取微信JS-SDK接口设置(access_token、jsapi_ticket、signature)
    前端引入JS文件<scriptsrc="http://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>或<scriptsrc="http://res2.wx.qq.com/open/js/jweixin-1.6.0.js"></script......
  • 初识 Express 丨Node.js
    目录​​一、初识Express​​​​1.1Express简介​​​​1.2Express的基本使用​​​​1.3托管静态资源​​​​1.4nodemon​​​​ Node.js前篇回顾:​​一、初识E......
  • Node异常时Pod状态分析
    场景一:停止kubelet并恢复操作和现象操作节点上运行Pod后把kubelet进程停掉。现象 node状态变为NotReady,不同类型的Pod情况不同。Deployment在默......
  • 适合编程初学者的开源云笔记系统(NodeJS版)
    目标为编程初学者打造入门学习项目,使用各种主流编程语言来实现。让想学编程的,一个都不落下。上述基本涵盖了当前编程开发所有主流语言。左侧为前端版本:安卓、iOS、鸿蒙......