生成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. ModelArts的雪中送炭,让我拿下CCF BDCI华为Severless工作负载预测亚军

    摘要: 中国计算机学会大数据与计算智能大赛(CCF BDCI)华为Severless工作负载预测亚军方案和ModelArts使用体验分享 本文分享自华为云社区<免费薅ModelArts算力资源- ...

  2. 非root安装Anaconda

    1.下载对应版本的Anaconda (wget+路径) 下载地址:https://repo.anaconda.com/archive/ 或者清华镜像:https://mirrors.tuna.tsin ...

  3. Solon 框架,想要使用 http2 怎么办?

    要使用支持 http2 的插件:solon.boot.undertow (目前,只有它支持),然后通过代码启用: @SolonMain public class SeverDemo { public ...

  4. PPT 如何将大段WORD制作成PPT

    PPT 如何将大段WORD制作成PPT 标记等级 发送到PPT 图片.表格,无法发送

  5. Python | 使用SVM支持向量机进行鸢尾花分类

    运行环境 Python: 3.7.1 库: sklearn (Python的机器学习工具箱) 目的: 根据鸢尾花的四个特征,对三种鸢尾花进行分类 数据(共150行,这里截取前6行,完整数据以及代码的下 ...

  6. JSP | out 对象详解

    原作者为 RioTian@cnblogs, 本作品采用 CC 4.0 BY 进行许可,转载请注明出处. 本篇学习自:C语言中文网,部分内容转载仅供学习使用. \[QAQ \] out 对象是一个输出流 ...

  7. CodeForces - 469A I Wanna Be the Guy

    There is a game called "I Wanna Be the Guy", consisting of n levels. Little X and his frie ...

  8. 智慧风电:数字孪生 3D 风机智能设备运维

    前言 6 月 1 日,福建省人民政府发布关于<福建省"十四五"能源发展专项规划>的通知.规划要求,加大风电建设规模.自 "30·60" 双碳目标颁布 ...

  9. KVM 核心功能:CPU 虚拟化

    1 vCPU 简介 CPU 负责计算机程序指令的执行.QEMU-KVM 提供对虚拟机 CPU 的模拟,对于虚拟机来说,其拥有的 CPU 是真实的, 和物理 CPU 没有区别. 实际上,虚拟机在 hos ...

  10. Pgsql之查询一个月份的天数

    前几天干活儿的时候,项目中有这么个需求,需要用pgsql查询某个月份有多少天,下面贴代码: select date_part('days', date_trunc('month', to_timest ...