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

yizhihongxing

下面是使用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日

相关文章

  • nodejs 日志模块winston的使用方法

    下面是关于“nodejs 日志模块winston的使用方法”的完整攻略: 什么是winston winston 是一个流行的 Node.js 日志记录库。它允许开发人员在应用程序中方便地配置、记录和存储日志消息,而无需编写适用于多个日志级别的自定义代码。winston 支持多种目标,例如文件、数据库、控制台和 syslog。 安装winston 在Node.…

    node js 2023年6月8日
    00
  • 详解Puppeteer 入门教程

    详解Puppeteer 入门教程 什么是Puppeteer Puppeteer是一个由Google Chrome团队开发的Node.js库,用于控制和操作Chrome浏览器。它提供了一个高级API,可以允许开发者通过JavaScript来直接操纵网页,例如生成页面截图、生成PDF、抓取数据、自动化表单提交等等。 安装Puppeteer 安装puppeteer…

    node js 2023年6月8日
    00
  • Node.js 深度调试方法解析

    Node.js 深度调试方法解析 为什么需要深度调试 Node.js? Node.js 是一个非常流行的后端开发框架,但是由于其异步、非阻塞的特性,在开发中常常会出现一些难以定位的问题。这时候深度调试就显得非常重要了。深度调试可以帮助开发者找到代码中的问题,并解决它们。下面是深度调试 Node.js 的一些方法。 调试 Node.js 的方法 Node.js…

    node js 2023年6月8日
    00
  • nodejs实现百度舆情接口应用示例

    为了讲解“nodejs实现百度舆情接口应用示例”的完整攻略,我们需要先了解以下几个内容: 什么是Node.js 什么是百度舆情接口 如何使用Node.js实现百度舆情接口应用示例 1. 什么是Node.js Node.js是一个基于Chrome V8引擎的JavaScript运行环境,其主要用于快速、轻松地构建高性能、可伸缩的网络应用程序。在Node.js环…

    node js 2023年6月8日
    00
  • 前端HTML+CSS笔试题面试题

    前端HTML+CSS笔试题面试题的攻略主要可分为以下几个步骤: 1.了解考察的知识点 通常前端HTML+CSS笔试题面试题考察的是HTML和CSS基础知识,包括文本标签、常见样式属性、选择器、盒模型、浮动、定位等。 2.准备常见题目的解答 可以在网上找到很多前端HTML+CSS笔试题面试题的解答,可以先将常见题目的解答准备好,熟记于心,以方便面试时能够快速回…

    node js 2023年6月8日
    00
  • 使用DNode实现php和nodejs之间通信的简单实例

    下面是关于“使用DNode实现php和nodejs之间通信的简单实例”的完整攻略。 什么是DNode? DNode是一个小型RPC库,它可以让你在Node.js和浏览器里面建立通信。它使用JSON-RPC 2.0协议来进行通信,并支持同步和异步调用。 DNode的核心思想: 在DNode里面,你只需要写一些代码来描述你希望共享什么样的对象。客户端和服务端之间…

    node js 2023年6月8日
    00
  • 什么时候不能在 Node.js 中使用 Lock Files

    在 Node.js 中,Lock Files是指npm或yarn生成的package-lock.json或yarn.lock文件,它记录了当前项目依赖的包的准确版本,可以保证在不同机器和环境下安装相同的依赖包时一致性。但是,在某些情况下,Lock Files也会带来一些问题。 以下是不能在 Node.js 中使用 Lock Files的具体情况及解决方案: …

    node js 2023年6月8日
    00
  • node版本快速切换及管理方法

    当需要在Node.js的不同版本之间切换时,我们可以使用Node Version Manager (nvm)。下面介绍如何使用nvm快速切换和管理不同版本的Node.js。 安装nvm 首先需要安装nvm。可以使用以下命令在Linux或macOS上安装nvm: curl -o- https://raw.githubusercontent.com/nvm-sh…

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