node.js express JWT token生成与校验的实现

 更新时间:2023年12月13日 10:23:14   作者:SuppperSA  
本文主要介绍了node.js express JWT token生成与校验的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

JWT

JWT 是轻量级的数据交换格式,相对于传统的 Session 机制,JWT 不需要在服务器端存储会话信息,而是将所有必要的信息包含在令牌本身中。

生成验证流程

用户账号密码注册或登录,服务端用HMACSHA256根据secret和base64Url编码后的headerpayload进行加密生成signature,然后将base64Url编码后的headerpayload以及signature通过“.”相连接,最终形式xxxx.yyyy.zzzz(token),之后用户每次请求资源的时候将访问令牌token放在请求头中,服务端在验证其是否有效之后,返回相对应的资源信息。

header(标头)

生成token的头信息,通常由两部分组成,包含令牌类型alg和所使用的签名算法typ

{
    "alg":"HS256",
    "typ":"JWT"
}

payload(有效负载)

通常包括生成jwt的非隐私信息,用户的唯一标识符id,发行时间iat,到期时间exp

{
  "id": "655c78ccd9107661e41abd9f",
  "iat": 1702260106,
  "exp": 1710036106
}

signature(签名)

HMAC-SHA256(Hash Message Authentication Code-Secure Hash Algorithm 256 bit)是一种加密算法,是SHA-256散列函数与一个密钥结合的身份验证方法。HMAC的安全性基于散列函数(SHA-256),而且可以通过密钥的添加来增加信任度。此算法经常用于网络领域中,例如 HTTPS、SSL、SSH 等加密通讯领域。

生成signature:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload), secret
)

访问令牌(token)

base64UrlEncode(header) + '.' + base64UrlEncode(payload) + '.' + signature

举例:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY1NWM3OGNjZDkxMDc2NjFlNDFhYmQ5ZiIsImlhdCI6MTcwMjI2MDEwNiwiZXhwIjoxNzEwMDM2MTA2fQ.ca-J91WaThntP3IhMBQNps9MVqts8oi_f62KcV2r4D8

express jwt生成、验证

1、安装jsonwebtoken依赖,npm install jsonwebtoken --save

2、在代码controller层引入依赖,在登录、注册的时候生成token

//环境变量,通过安装dotenv依赖,在express入口文件中加载,
这么做的目的是不让密钥等敏感信息硬编码在代码中


JWT_SECRET=this-is-my-secret-password
JWT_EXPIRES_IN=90d

生成jwt

// authController.js 用户的登录、注册、密码修改、token生成、权限校验、凭证认证等
const jwt = require('jsonwebtoken');

const signToken = id => {
  return jwt.sign({ id }, process.env.JWT_SECRET, {
    expiresIn: process.env.JWT_EXPIRES_IN
  });
};

验证jwt

promisify(jwt.verify)(token, process.env.JWT_SECRET);

const { promisify } = require('util'); 

// protect中间件, 用于验证用户
exports.protect = catchAsync(async (req, res, next) => {
  let token;
  if (
    req.headers.authorization &&
    req.headers.authorization.startsWith('Bearer')
  ) {
    token = req.headers.authorization.split(' ')[1];
  }

  if (!token) {
    return next(
      new AppError('您还还没有登录或注册', 401)
    );
  }

  // 2) 验证 token
  const decoded = await promisify(jwt.verify)(token, process.env.JWT_SECRET);
  
  // 验证jwt是否有效,decode信息是payload,其中包含用户生成jwt的id、iat、exp
  // 通过这个唯一id可以查询用户信息,如果promisify是rejected则进行错误处理逻辑
});

到此这篇关于node.js express JWT token生成与校验的实现的文章就介绍到这了,更多相关express JWT token生成与校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • node版本太高导致项目跑不起来的解决办法(windows)

    node版本太高导致项目跑不起来的解决办法(windows)

    换了台电脑后,安装node,一切完美,发现其中有一个uniapp的小程序项目跑不起来,感觉是node版本太高导致的,所以只能重新安装低版本的node,本文给大家介绍了node版本太高的解决办法,需要的朋友可以参考下
    2023-10-10
  • 一文搞懂npm install 意义

    一文搞懂npm install 意义

    我们在安装依赖包的时候,不需要过多的去纠结是使用 -S 还是 -D 呢 ?随便安装到 dependencies 或者 devDependencies 里都行,反正 npm install的时候,都会安装dependencies 和 devDependencies依赖,今天通过本文学习npm install意义,感兴趣的朋友跟随小编一起看看吧
    2022-12-12
  • 使用ExcelJS快速处理Node.js爬虫数据

    使用ExcelJS快速处理Node.js爬虫数据

    Excel.js是一个强大的JavaScript库,它提供了方法处理Excel文件,例如创建和编辑工作簿、读取和写入数据、处理行和列、设置样式、导入和导出数据等,本文介绍使用ExcelJS快速处理Node.js爬虫数据的方法,一起看看吧
    2024-01-01
  • 基于node打包可执行文件工具_Pkg使用心得分享

    基于node打包可执行文件工具_Pkg使用心得分享

    下面小编就为大家分享一篇基于node打包可执行文件工具_Pkg使用心得分享,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • 利用express启动一个server服务的方法

    利用express启动一个server服务的方法

    下面小编就为大家带来一篇利用express启动一个server服务的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • node.js中的http.createServer方法使用说明

    node.js中的http.createServer方法使用说明

    这篇文章主要介绍了node.js中的http.createServer方法使用说明,本文介绍了http.createServer的方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
    2014-12-12
  • 关于npm install过程失败的几种处理方式

    关于npm install过程失败的几种处理方式

    这篇文章主要介绍了关于npm install过程失败的几种处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Visual Studio Code中npm脚本找不到图文解决办法

    Visual Studio Code中npm脚本找不到图文解决办法

    这篇文章主要给大家介绍了关于Visual Studio Code中npm脚本找不到的图文解决办法,做前端开发如果项目达到了一定的规模就离不开npm了,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • Nodejs读取本地json文件,输出json数据接口方式

    Nodejs读取本地json文件,输出json数据接口方式

    这篇文章主要介绍了Nodejs读取本地json文件,输出json数据接口方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • node puppeteer(headless chrome)实现网站登录

    node puppeteer(headless chrome)实现网站登录

    这篇文章主要介绍了node puppeteer(headless chrome)实现网站登录,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05

最新评论