0
点赞
收藏
分享

微信扫一扫

一文了解JWT,及NodeJS应用

ZGtheGreat 2023-11-21 阅读 55


 JSON Web Token(JWT)是一种用于在各方之间安全传输信息的开放标准。JWT 是一种自包含的令牌格式,它将用户身份信息、用途和到期时间等数据编码到一个紧凑的字符串中。这使得 JWT 可以在不同系统之间轻松传递,同时保持紧凑和安全。

JWT 由三部分组成:

  1. 头部(Header):包含有关令牌类型和使用的哈希算法的信息。
  2. 载荷(Payload):包含实际的数据,如用户身份信息、到期时间等。
  3. 签名(Signature):通过使用私钥或共享密钥对头部和载荷进行哈希计算,以确保数据的完整性和来源。

JWT 的一些主要应用场景包括:

  1. 身份验证:在用户登录时,服务器生成一个 JWT 并将其发送给客户端。客户端将此令牌存储在本地,并在后续请求中将令牌添加到 Authorization 头中。服务器可以验证令牌以确认用户身份。
  2. 授权:JWT 可以包含用户权限信息,以便在不访问数据库的情况下检查用户是否有权访问特定资源。
  3. 数据传输:JWT 可以在不同系统之间安全地传输数据,例如在微服务架构中。

以下是一个 JWT 示例:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

在这个示例中:

  • eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 是编码后的头部,表示使用 HS256 哈希算法。
  • eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ 是编码后的载荷,包含用户 ID、用户名和到期时间等信息。
  • SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c 是签名,通过对头部和载荷进行哈希计算得到。

JWT 的优点包括:

  • 紧凑性:JWT 是一个紧凑的字符串,可以轻松地在不同系统之间传递。
  • 无状态:JWT 包含了所有必要的身份验证信息,无需在服务器上存储额外的状态。
  • 安全性:JWT 可以通过使用哈希算法和签名来保护数据的完整性和来源。

然而,JWT 也有一些局限性,例如:

  • 无法撤销:一旦 JWT 签发,它将一直有效,除非到期。如果需要撤销用户访问权限,需要使用其他方法,例如黑名单。
  • 载荷大小限制:JWT 的载荷大小有限制,因此不适合存储大量数据。

总之,JWT 是一种用于在各方之间安全传输信息的开放标准。它可以用于身份验证、授权和数据传输等场景。

在 Node.js 中,我们可以使用 jsonwebtoken 库来实现 JWT 的创建、验证和解析。首先,我们需要安装这个库:

npm install jsonwebtoken

一文了解JWT,及NodeJS应用_服务器_02

接下来,我们将介绍如何使用 jsonwebtoken 库创建和验证 JWT。

        1.创建 JWT:

const jwt = require('jsonwebtoken');

const payload = {
  userId: '123',
  username: 'exampleUser',
  exp: Math.floor(Date.now() / 1000) + (60 * 60), // 令牌将在 60 分钟后过期
};

const secretKey = 'your-secret-key';

const token = jwt.sign(payload, secretKey);

console.log('Generated token:', token);

一文了解JWT,及NodeJS应用_nodejs_03

在这个示例中,我们创建了一个 JWT,其中包含用户 ID、用户名和到期时间。我们使用 jwt.sign() 方法对载荷进行签名,并使用共享密钥对其进行哈希。

        2.验证和解析 JWT:

const jwt = require('jsonwebtoken');

const token = 'your-jwt-token'; // 从请求头中获取的 JWT
const secretKey = 'your-secret-key';

try {
  const decoded = jwt.verify(token, secretKey);
  console.log('Decoded token:', decoded);
} catch (error) {
  console.error('Invalid token:', error.message);
}

在这个示例中,我们使用 jwt.verify() 方法验证 JWT 的签名。如果签名有效,我们将获取解码后的载荷。否则,将捕获错误并输出错误消息。

这就是如何在 Node.js 中使用 jsonwebtoken 库创建和验证 JWT。当然,实际应用中可能需要根据具体需求对这些示例进行调整。

在这里我推荐使用Btools的在线JWT解析工具,帮助大家在使用JWT过程中,能够快速验证解析JWT令牌内容的正确性。在线JWT解析 - BTools在线工具软件,为开发者提供方便。

一文了解JWT,及NodeJS应用_jwt_04

举报

相关推荐

0 条评论