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

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

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

开始课程

JWT令牌在JavaScript(Node.js)



JSON Web Token (JWT) 是一种基于JSON的开放标准(RFC 7519),用于创建访问令牌。JWT广泛应用于现代Node.js Web应用程序中,用于客户端和服务器之间的身份验证和信息交换。在本文中,我们将介绍如何使用流行的jsonwebtoken库在Node.js环境中处理JWT。



什么是JWT?



JWT由三部分组成,各部分之间用点号分隔:



  • Header — 头部,包含令牌类型和签名算法(例如HS256或RS256)。
  • Payload — 有效载荷,存储数据(声明):用户ID、角色、令牌有效期等。
  • Signature — 签名,基于头部、有效载荷和密钥生成。签名确保令牌未被篡改。


JWT的视觉表示如下:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c



安装jsonwebtoken库



在Node.js中处理JWT需要使用jsonwebtoken包。通过npm安装:



npm install jsonwebtoken


安装后,您可以将该库导入到项目中:



const jwt = require('jsonwebtoken');


生成(签名)JWT令牌



使用jwt.sign()方法创建令牌。它接受三个主要参数:



  • payload — 包含要编码到令牌中的数据的对象。
  • secretOrPrivateKey — 密钥(或用于RSA/ECDSA算法的私钥)。
  • options — 包含选项的对象,例如用于设置令牌有效期的expiresIn。


生成令牌的示例:



const jwt = require('jsonwebtoken');

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

const secretKey = 'your-secret-key-here';

const token = jwt.sign(payload, secretKey, { expiresIn: '1h' });

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


在此示例中,令牌有效期为1小时。您也可以以秒为单位指定时间(expiresIn: 3600),或使用其他格式,例如'7d'(7天)或'30m'(30分钟)。



验证JWT令牌



使用jwt.verify()方法验证令牌的真实性。如果令牌有效,它将返回解码后的有效载荷;如果令牌已过期或签名无效,则会抛出错误。



const jwt = require('jsonwebtoken');

const token = 'eyJhbGciOiJIUzI1NiIs...'; // 您的令牌const secretKey = 'your-secret-key-here';

try { const decoded = jwt.verify(token, secretKey); console.log('解码后的数据:', decoded);} catch (err) { console.error('验证错误:', err.message);}


如果令牌已过期,您将收到错误'jwt expired'。如果签名无效,则会收到'invalid signature'。



不解码签名进行解码



有时您只需要读取令牌中的数据而不验证签名(例如,用于调试)。为此,请使用jwt.decode():



const jwt = require('jsonwebtoken');

const token = 'eyJhbGciOiJIUzI1NiIs...';const decoded = jwt.decode(token);

console.log('未验证的有效载荷:', decoded);


重要提示:jwt.decode()不验证签名,因此请勿在生产环境中将其用于身份验证。



Express的JWT中间件



在基于Express的Web应用程序中,JWT通常用于保护路由。让我们创建一个简单的中间件,用于验证来自标头的令牌:

推荐