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

简介: 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.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过期的代码结束
});

遇见问题,这是你成长的机会,如果你能够解决,这就是收获。

相关文章
|
JSON 缓存 JavaScript
❤Nodejs 第十章(用户信息token认证和登录接口开发)
【4月更文挑战第10天】本文介绍了Node.js中实现用户信息token认证和登录接口的步骤。express-jwt的使用,接着创建基本的Express服务器,然后导入并使用jsonwebtoken和express-jwt。设置一个密钥,并定义一个中间件处理token验证。示例展示了登录接口的实现。遇到登录判断失效的问题后,对判断条件进行了优化。
432 2
|
JSON JavaScript 前端开发
❤Nodejs 第九章(token身份认证和express-jwt的安装认识)
【4月更文挑战第9天】Node.js第九章介绍了Token身份认证,特别是JWT(JSON Web Token)作为跨域认证的解决方案。JWT由Header、Payload和Signature三部分组成,用于在客户端和服务器间安全传输用户信息。前端收到JWT后存储在localStorage或sessionStorage中,并在请求头中发送。Express-JWT是一个中间件,用于解析JWT。基本用法包括设置secret和algorithms。注意安全问题,避免混合使用不同算法以防止降级攻击。
223 0
报错/ ./node_modules/axios/lib/platform/index.js Module parse failed: Unexpected token (5:2)怎么解决?
报错/ ./node_modules/axios/lib/platform/index.js Module parse failed: Unexpected token (5:2)怎么解决?
|
12月前
|
存储 JSON 前端开发
node使用token来实现前端验证码和登录功能详细流程[供参考]=‘很值得‘
本文介绍了在Node.js中使用token实现前端验证码和登录功能的详细流程,包括生成验证码、账号密码验证以及token验证和过期处理。
370 0
node使用token来实现前端验证码和登录功能详细流程[供参考]=‘很值得‘
|
前端开发 JavaScript 数据安全/隐私保护
无感刷新token(vue2+nodejs版本)
无感刷新token(vue2+nodejs版本)
|
JavaScript 前端开发 Linux
【Azure 应用服务】NodeJS Express + MSAL 实现API应用Token认证(AAD OAuth2 idToken)的认证实验 -- passport.authenticate()
【Azure 应用服务】NodeJS Express + MSAL 实现API应用Token认证(AAD OAuth2 idToken)的认证实验 -- passport.authenticate()
143 0
|
存储 JavaScript API
❤Nodejs 第十三章(文件上传接口以及token添加)
【4月更文挑战第13天】Nodejs第十三章介绍了文件上传接口和Token添加。使用Multer库处理文件上传,设置存储引擎和静态文件目录,定义上传接口,支持单个文件上传。上传成功返回文件信息和访问路径。为解决静态文件访问需要Token认证的问题,更新expressjwt配置,排除包含uploads的路径,确保静态文件可正常访问。
245 2
|
2月前
|
JavaScript Unix Linux
nvm与node.js的安装指南
通过以上步骤,你可以在各种操作系统上成功安装NVM和Node.js,从而在不同的项目中灵活切换Node.js版本。这种灵活性对于管理不同项目的环境依赖而言是非常重要的。
755 11
|
7月前
|
弹性计算 JavaScript 前端开发
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
Node.js 是一种高效的 JavaScript 运行环境,基于 Chrome V8 引擎,支持在服务器端运行 JavaScript 代码。本文介绍如何在阿里云上一键部署 Node.js 环境,无需繁琐配置,轻松上手。前提条件包括 ECS 实例运行中且操作系统为 CentOS、Ubuntu 等。功能特点为一键安装和稳定性好,支持常用 LTS 版本。安装步骤简单:登录阿里云控制台,选择扩展程序管理页面,安装 Node.js 扩展,选择实例和版本,等待创建完成并验证安装成功。通过阿里云的公共扩展,初学者和经验丰富的开发者都能快速进入开发状态,开启高效开发之旅。
|
6月前
|
资源调度 JavaScript 前端开发
前端开发必备!Node.js 18.x LTS保姆级安装教程(附国内镜像源配置)
本文详细介绍了Node.js的安装与配置流程,涵盖环境准备、版本选择(推荐LTS版v18.x)、安装步骤(路径设置、组件选择)、环境验证(命令测试、镜像加速)及常见问题解决方法。同时推荐开发工具链,如VS Code、Yarn等,并提供常用全局包安装指南,帮助开发者快速搭建高效稳定的JavaScript开发环境。内容基于官方正版软件,确保合规性与安全性。
5530 24