JavaScript (Node.js) 中的 JWT 令牌:完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

JavaScript (Node.js) 中的 JWT 令牌:jsonwebtoken 库完整指南

JSON Web Token (JWT) 是一种基于 JSON 的开放标准 (RFC 7519),用于创建访问令牌。JWT 广泛用于客户端和服务器之间的身份验证和信息交换。在 Node.js 生态系统中,最流行的 JWT 库是 jsonwebtoken。在本文中,我们将详细介绍如何安装、配置和使用该库来构建安全的 Web 应用程序。



什么是 JWT,为什么需要它?

JWT 是一个由三部分组成的字符串,各部分由点分隔:Header(头部)、Payload(负载)和 Signature(签名)。令牌看起来像这样:xxxxx.yyyyy.zzzzz。JWT 的主要优点:

  • 安全性 — 令牌使用密钥或密钥对 (RSA/ECDSA) 进行签名,确保其完整性。
  • 自包含性 — 验证身份所需的所有信息都包含在令牌本身中,从而减少了对数据库的查询次数。
  • 跨平台性 — JWT 适用于任何编程语言和平台。
  • 灵活性 — 您可以在负载中添加任何自定义数据(例如,用户 ID、角色)。


安装 jsonwebtoken 库

要在 Node.js 中使用 JWT,请通过 npm 安装 jsonwebtoken 包:

npm install jsonwebtoken

安装后,在您的文件中引入该库:

const jwt = require('jsonwebtoken');


生成(签名)JWT 令牌

要创建令牌,请使用 jwt.sign(payload, secretOrPrivateKey, options) 方法。来看一个基本示例:

const jwt = require('jsonwebtoken');

const payload = { userId: 123, role: 'user'};

const secretKey = 'my_super_secret_key_123';

const token = jwt.sign(payload, secretKey, { expiresIn: '1h', // 令牌将在 1 小时后过期 algorithm: 'HS256' // 签名算法(默认为 HS256)});

console.log('生成的令牌:', token);

重要提示:切勿将密钥硬编码在代码中。请使用环境变量(.env 文件)。为此,请安装 dotenv 包:

npm install dotenv

使用环境变量的示例:

require('dotenv').config();const jwt = require('jsonwebtoken');

const token = jwt.sign( { userId: 456 }, process.env.JWT_SECRET, { expiresIn: '7d' });


验证 JWT 令牌

要验证令牌的真实性,请使用 jwt.verify(token, secretOrPublicKey, options) 方法。如果令牌有效,它将返回负载;如果令牌已过期或无效,则会抛出错误。

const token = '您的令牌在此';

try { const decoded = jwt.verify(token, process.env.JWT_SECRET); console.log('解码后的数据:', decoded); // { userId: 456, iat: 1700000000, exp: 1700600000 }} catch (err) { if (err.name === 'TokenExpiredError') { console.log('令牌已过期'); } else if (err.name === 'JsonWebTokenError') { console.log('无效的令牌'); } else { console.log('验证错误:', err.message); }}

请注意 iat(签发时间)和 exp(过期时间)字段,如果指定了 expiresIn 参数,这些字段会自动添加。



Express.js 中间件

在实际应用中,JWT 通常在中间件中进行验证。以下是 Express.js 的示例:

const express = require('express');const jwt = require('jsonwebtoken');require('dotenv').c                    

推荐