在node中使用jwt签发与验证token的方法

下面是使用Node.js实现JWT签发和验证的完整攻略:

什么是JWT

JSON Web Token(JWT)是一种开放标准(RFC 7519),用于在各方之间安全地将信息作为JSON对象传输。此信息可以被验证和信任,因为它是数字签名的。JWT通常用于身份验证和授权。

JWT由三个部分组成,它们分别是头部(Header)、载荷(Payload)和签名(Signature),其格式如下:

$header.base64UrlEncode() + "." + $payload.base64UrlEncode() + "." + $signature.base64UrlEncode()

其中,Base64Url Encode是对字符串进行Base64编码后再使用URL规则进行转换得到的结果。签名部分用于确保 JWT 不会被篡改,因此需要对头部和载荷进行数字签名。

安装和引入jsonwebtoken包

首先,需要安装jsonwebtoken包,该包可以用于生成和验证JWT。可以使用以下命令进行安装:

npm install jsonwebtoken

然后,在需要使用jsonwebtoken的地方,可以使用以下代码将jsonwebtoken包引入:

const jwt = require("jsonwebtoken");

JWT的签发

基本使用

下面的代码演示如何使用 Node.js 生成 JWT:

// 定义要签发的JWT
const payload = {
  username: "username",
  expirationTime: new Date().getTime() + 10 * 60 * 1000 // 10分钟后过期
};

// 生成JWT的签名
const secretKey = "secretKey";
const options = {
  expiresIn: "10m"
};
const token = jwt.sign(payload, secretKey, options);

console.log(token);

在上面的代码中,首先定义了要签发的JWT的负载(payload),其中包含了用户名和过期时间信息。然后使用secretKey字符串定义了JWT的密钥。在options参数中指定了JWT的有效期为10分钟。最后使用jwt.sign方法生成了JWT。

自定义头部

可以使用以下方法设置JWT的头部标签:

// 自定义jwt的头部数据
const header = {
  "alg": "HS256",
  "typ": "JWT",
  "kid": "0001"
};

// 生成JWT的签名
const secretKey = "secretKey";
const options = {
  expiresIn: "10m",
  header: header
};
const token = jwt.sign(payload, secretKey, options);

console.log(token);

在上面的代码中,使用header对象来指定JWT的头部标签的内容,并将其包含在options参数中以便传递给jwt.sign方法。

JWT的验证

验证JWT需要验证其签名是否正确以及其有效期是否未过期,下面是基本使用方法:

// 定义jwt、密钥及选项
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiZXhwaXJhdGlvblRpbWUiOjE2MzAzMzA5NTYsImlhdCI6MTYzMDMzMDY1Nn0.b11WcpiTFHSMswgX5S6pYC2nAjFmUgr6QQGQEFXGmTQ";
const secretKey = "secretKey";
const options = {
  algorithms: ["HS256"]
};

// 验证jwt
jwt.verify(token, secretKey, options, function(err, decoded) {
  if (err) {
    console.log(err);
  } else {
    console.log(decoded);
  }
});

在上面的代码中,使用jwt.verify方法验证JWT的正确性。options参数用于指定JWT的算法,decoded参数用于返回未签名的JWT负载。

示例说明

示例 1:用户登录后签发JWT

下面是一个用户登录后,向客户端返回JWT的代码示例。假设有一个名为 login 的接口,它处理用户输入的用户名和密码并验证。如果验证通过,则生成JWT,并将其发送回客户端。

app.post('/login', (req, res) => {
  // 在验证用户名和密码成功后,生成JWT
  const payload = { userid: "用户ID" };
  const secretKey = "secretKey";
  const options = { expiresIn: "1h" };
  const token = jwt.sign(payload, secretKey, options);

  // 发送JWT到客户端
  res.send({ token: token });
});

在上面的代码中,当验证用户名和密码成功时,将生成一个包含user ID的payload,使用secretKey字符串和有效期为 1 小时的选项生成JWT。然后将JWT作为响应发送到客户端。

示例 2:验证JWT是否过期

下面是一个验证JWT是否过期的代码示例。在此示例中,我们使用jwt.verify方法来验证JWT的有效性和有效期。

// 定义要验证的JWT
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE1ODY4NjkxMTJ9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c";

// 定义jwt选项
const secretKey = "secretKey";
const options = {};

// 验证jwt
jwt.verify(token, secretKey, options, function(err, decoded) {
  if (err) {
    if (err.name === "TokenExpiredError") {
      console.log("该JWT已过期");
    } else {
      console.log("JWT无效,", err.message);
    }
  } else {
    console.log("该JWT有效,有效期到", new Date(decoded.exp * 1000));
  }
});

在上面的代码中,使用了jwt.verify方法来验证JWT的有效性。如果JWT有效,则将其有效期用decoded.exp返回,如果JWT过期,则err对象的name属性将是“TokenExpiredError”。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在node中使用jwt签发与验证token的方法 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 动态的样式表lesscss:简单学习lesscss语法

    动态的样式表lesscss:简单学习lesscss语法 什么是LessCSS LessCSS是一种CSS预处理器,它可以扩展CSS语言,为CSS引入了变量、函数、混合、嵌套规则等特性,进一步简化了CSS的编写并使其更易于维护。 LessCSS语法 变量 使用@符号声明一个变量,并给定一个值。如: @myColor: blue; 在其他地方可以使用@myCol…

    node js 2023年6月9日
    00
  • Node.js Sequelize如何实现数据库的读写分离

    Node.js中的Sequelize是一种非常流行的ORM(对象关系映射)框架,它提供了兼容多种数据库的API,支持数据库的读写分离。下面是关于如何使用Sequelize实现数据库的读写分离的攻略: 什么是数据库读写分离 数据库读写分离(database read-write separation)是指将数据库的读操作和写操作分别放在不同的实例上,以实现更高…

    node js 2023年6月8日
    00
  • Vue使用Echarts实现数据可视化的方法详解

    下面我将详细讲解“Vue使用Echarts实现数据可视化的方法详解”的攻略,包含以下内容: 概述 本攻略主要介绍如何在Vue项目中使用Echarts进行数据可视化。Echarts是一个非常强大的数据可视化库,提供了各种不同类型的图表(例如折线图、柱状图、饼图、地图等)以及丰富的交互功能。 1. 安装Echarts 首先需要在项目中安装Echarts。可以使用…

    node js 2023年6月8日
    00
  • JS实现的贪吃蛇游戏案例详解

    JS实现的贪吃蛇游戏案例详解 游戏规则 贪吃蛇游戏是一种非常经典的游戏,规则如下: 贪吃蛇每次只能往上、下、左、右四个方向的其中一个方向走; 贪吃蛇的身体每增加一节长度,分数就会增加一分; 贪吃蛇在吃到“食物”时身体长度加一,可以得到分数; 贪吃蛇撞到边界或者自己的身体就会死亡,游戏结束; 游戏过程中,可以随时暂停或重新开始。 实现过程 创建游戏区域 首先,…

    node js 2023年6月8日
    00
  • Node.js+express+socket实现在线实时多人聊天室

    Node.js是基于Chrome V8引擎的JavaScript运行环境,可以使得开发者在服务器端使用JavaScript语言。express是一种基于Node.js开发的Web应用框架,提供了一些常用的Web应用开发功能,并且易于扩展。socket是一种实现实时通讯的技术,能够使得客户端和服务器之间实现双向即时消息传输。 下面简单介绍如何通过Node.js…

    node js 2023年6月8日
    00
  • node.js中RPC(远程过程调用)的实现原理介绍

    下面是详细讲解“node.js中RPC(远程过程调用)的实现原理介绍”的完整攻略。 什么是RPC RPC(Remote Procedure Call)即远程过程调用,是一种计算机通信协议。它允许程序调用其他进程或者跨网络机器上的线程上的函数,而不需要程序员显式编写网络通信代码。 在RPC中,客户机调用服务器上的远程过程,就像本地调用一样。RPC框架会自动将数…

    node js 2023年6月8日
    00
  • Nodejs高扩展性的模板引擎 functmpl简介

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时,是一个使用非阻塞和事件驱动 I/O模型的服务器端 JavaScript 环境。但是Node.js 自身并不具备模板引擎功能,于是出现了大量的第三方模板引擎,其中 functmpl 就是一款高扩展性的模板引擎。 什么是 functmpl functmpl 是一个轻量级的 Ja…

    node js 2023年6月8日
    00
  • JavaScript中栈和队列应用详情

    JavaScript中栈和队列是常用的数据结构,它们可以在各种场景中发挥重要作用。下面将详细讲解栈和队列在JavaScript中的应用以及使用方法。 栈 (Stack) 的应用 栈是一种后进先出 (LIFO) 的数据结构,在JavaScript中常用于实现浏览器的前进/后退功能、函数调用堆栈、撤销/恢复以及表达式计算等场景。 实现浏览器的前进/后退功能 浏览…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部