生成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借助jsonwebtoken生成token以及验证token是否过期的更多相关文章

  1. node使用JsonWebToken 生成token,完成用户登录、登录检测

    最近在用node做后台的登录,检测登录功能.在本地使用session可以成功,但是放服务器后发现session失效了,每次请求session都会变化,着了很久原因.原来,自己项目是前后端分离的,前端调 ...

  2. 在node中使用jwt签发与验证token

    1.什么是token token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识. token是在服务端产生的.如果前端使用用户名和密码向服务端发送请求认证,服务端认证成功,那 ...

  3. Python itsdangerous 生成token和验证token

    代码如下 class AuthToken(object): # 用于处理token信息流程: # 1.更加给定的用户信息生成token # 2.保存生成的token,以便于后面验证 # 3.对用户请求 ...

  4. 基于ASP.NET Core Data Protection生成验证token

    ASP.NET Core Data Protection 不仅提供了非对称加密能力,而且提供了灵活的秘钥存储方式以及一致的加解密接口(Protect与Unprotect).Session中用到了它,C ...

  5. session-cookie 和token登录验证

    最近研究了下基于token的身份验证,并将这种机制整合在个人项目中.现在很多网站的认证方式都从传统的seesion+cookie转向token校验.对比传统的校验方式,token确实有更好的扩展性与安 ...

  6. 基于JWT的Token身份验证

    ​ 身份验证,是指通过一定的手段,完成对用户身份的确认.为了及时的识别发送请求的用户身份,我们调研了常见的几种认证方式,cookie.session和token. 1.Cookie ​ cookie是 ...

  7. Spring Security框架下Restful Token的验证方案

    项目使用Restful的规范,权限内容的访问,考虑使用Token验证的权限解决方案. 验证方案(简要概括): 首先,用户需要登陆,成功登陆后返回一个Token串: 然后用户访问有权限的内容时需要上传T ...

  8. Koa - 中间件(理解中间件、实现一个验证token中间件)

    前言 Koa 应用程序是一个包含一组中间件函数的对象,它是按照类似堆栈的方式组织和执行的. 当一个中间件调用 next() 则该函数暂停并将控制传递给定义的下一个中间件.当在下游没有更多的中间件执行后 ...

  9. vue & nodejs jwt 的基于token身份验证

    现在比较流行的验证方式,是带着token的登录验证 原理 1. 登陆时,客户端发送用户名密码 2. 服务端验证用户名密码是否正确,校验通过就会生成一个有时效的token串,发送给客户端 3. 客户端储 ...

  10. Spring Cloud中Feign如何统一设置验证token

    代码地址:https://github.com/hbbliyong/springcloud.git 原理是通过每个微服务请求之前都从认证服务获取认证之后的token,然后将token放入到请求头中带过 ...

随机推荐

  1. 开心档之MySQL 创建数据库

    MySQL 创建数据库 我们可以在登陆 MySQL 服务后,使用 create 命令创建数据库,语法如下: CREATE DATABASE 数据库名; 以下命令简单的演示了创建数据库的过程,数据名为 ...

  2. Leaflet 百度、高德地图瓦片坐标 偏移 纠偏

    实现地图瓦片纠偏的leaflet.mapCorrection.js代码: //坐标转换 L.CoordConvertor = function () { /**百度转84*/ this.bd09_To ...

  3. 微信公众号短链实时阅读量、点赞数爬虫(不会Hook可用)

    众所周知,微信分享的公众号分享出的一般都是短链,在这个锻炼下使用浏览器打开并不能获取微信公众的阅读量点赞数等这些信息,如图1所示. 但是实际拥有详细信息的则是这个链接下面,提取链接所需要提交的信息包括 ...

  4. JSP | IDEA 配置 JSP 模板

    新建 jsp 文件时的模板 在第 5 步输入下面模板代码: <%-- Created by IntelliJ IDEA. User: ${USER} Date: ${DATE} Time: ${ ...

  5. L1-046 整除光棍 (20分)

    问题描述 这里所谓的"光棍",并不是指单身汪啦~ 说的是全部由1组成的数字,比如1.11.111.1111等.传说任何一个光棍都能被一个不以5结尾的奇数整除.比如,111111就可 ...

  6. 【Serverless实战】传统单节点网站的Serverles

    什么是函数?刚刚考完数学没多久的我,脑里立马想到的是自变量.因变量.函数值,也就是y=f(x).当然,在计算机里,函数function往往指的是一段被定义好的代码程序,我们可以通过传参调用这个定义好的 ...

  7. echarts常见问题及解决方法

    https://blog.csdn.net/weixin_46928381/article/details/122875609

  8. P1216-DP【橙】

    在这道题中,我第一次用了memset,确实方便,不过需要注意的是只有全部赋值-1和0的时候才能使用它,否则他能干出吓死人的事.以及memset在cstring头文件里,在本地就算不include也能照 ...

  9. java - 递归排序 - 求数组最小值

    // 递归求数组最小值 public class Bubble { // 定义存储最小值的变量 static int min; public static void main(String[] arg ...

  10. Laravel - 解决 $.ajax success 返回的数据为空的问题 (后台为laravel)

    原因之一 :  后台 dump()打印 , 去掉或者注释就好了