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通常用于保护路由。让我们创建一个简单的中间件,用于验证来自标头的令牌: