2026/4/18 12:22:48
网站建设
项目流程
江门网站优化,吕梁推广型网站建设,公司执照注册流程及费用,求个网站能用的JWT#xff08;JSON Web Token#xff09;在 Node.js 中的加密与解密机制以及过期判断 目录
一、JWT结构
二、Node.js 加解密#xff08;验证#xff09;JWT
2.1 安装库
2.2 生成 Token#xff08;签名#xff09;
2.3 解密#xff08;验证#xff09;Token
2.4 …JWTJSON Web Token在 Node.js 中的加密与解密机制以及过期判断目录一、JWT结构二、Node.js 加解密验证JWT2.1 安装库2.2 生成 Token签名2.3 解密验证Token2.4 支持的算法列表过期时间判断机制三、常见场景代码3.1 Express 中间件验证3.2 前端加入Bearer时的处理方式四、安全建议一、JWT结构JWT 是签名签名验证由三部分组成Header.Payload.SignatureHeader编码这个 JSON 对象会被Base64Url编码形成 JWT 的第一部分字符串。{ alg: HS256, typ: JWT }Payload传递的数据Claims存放实际要传输的信息。{ userId: 12345, username: testuser }编码这个 JSON 对象也会被Base64Url编码形成 JWT 的第二部分字符串。⚠️极度重要提示Payload 是不加密的只是进行了 Base64 编码。任何人拿到 Token 都可以解码看到 Payload 里的内容。千万不要在 Payload 里放密码、手机号等敏感信息Signature作用安全验证防止 Token 被篡改。这一部分是你看不懂的乱码它是通过前面两部分计算出来的。生成逻辑它需要使用编码后的 Header编码后的 Payload一个服务器持有的密钥 (secret)Header 中指定的算法 (如 HMAC SHA256)最后系统将这三部分用 . 连起来就生成了最终的 TokenencodedHeader.encodedPayload.signature示例eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEyMzQ1LCJleHAiOjE3MzM5NzAwMDB9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c三部分详解部分内容编码方式Header算法和类型Base64UrlPayload数据含过期时间Base64UrlSignature签名防篡改HMAC-SHA256二、Node.js 加解密验证JWT2.1 安装库npm install jsonwebtoken2.2 生成 Token签名const jwt require(jsonwebtoken); const SECRET_KEY your-secret-key; // 密钥妥善保管 // 生成 token const token jwt.sign( { userId: 12345, username: testuser }, SECRET_KEY, { expiresIn: 2h, // 2小时后过期 algorithm: HS512 // --- 在这里修改算法指定使用 HMAC SHA-512 } ); console.log(token);Payload 中自动添加的字段iatissued at签发时间戳expexpiration过期时间戳2.3 解密验证Tokenconst jwt require(jsonwebtoken); const SECRET_KEY your-secret-key; const token eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...; try { // 解密并验证会自动检查过期时间 const decoded jwt.verify(token, SECRET_KEY); console.log(解密成功, decoded); /* 输出 { userId: 12345, username: testuser, iat: 1733966579, // 签发时间 exp: 1733973779 // 过期时间 } */ } catch (err) { if (err.name TokenExpiredError) { console.log(Token 已过期); console.log(过期时间, err.expiredAt); } else if (err.name JsonWebTokenError) { console.log(Token 无效签名错误或格式错误); } else { console.log(验证失败, err.message); } }2.4 支持的算法列表在 Node.js 的 jsonwebtoken 库中常见的支持算法包括算法类型算法名称说明密钥要求HMAC (对称)HS256HMAC using SHA-256 (默认)字符串 / BufferHS384HMAC using SHA-384字符串 / BufferHS512HMAC using SHA-512字符串 / BufferRSA (非对称)RS256RSASSA-PKCS1-v1_5 using SHA-256私钥签名 / 公钥验证RS384... SHA-384私钥 / 公钥RS512... SHA-512私钥 / 公钥ECDSA (非对称)ES256ECDSA using P-256 and SHA-256私钥 / 公钥过期时间判断机制jwt.verify()会自动检查过期时间无需手动判断jwt.verify(token, SECRET_KEY); // 过期会抛出 TokenExpiredError三、常见场景代码3.1 Express 中间件验证const jwt require(jsonwebtoken); const SECRET_KEY your-secret-key; function authenticateToken(req, res, next) { const authHeader req.headers[authorization]; const token authHeader authHeader.split( )[1]; // Bearer TOKEN if (!token) { return res.status(401).json({ error: 缺少 token }); } try { const user jwt.verify(token, SECRET_KEY); req.user user; // 将用户信息挂载到 request next(); } catch (err) { if (err.name TokenExpiredError) { return res.status(401).json({ error: Token 已过期 }); } return res.status(403).json({ error: Token 无效 }); } } // 使用 app.get(/protected, authenticateToken, (req, res) { res.json({ message: 访问成功, user: req.user }); });3.2 前端发送Bearer Token时的处理方式前端发送 Bearer Token时后端必须去掉Bearer前缀才能解析 Token// 前端请求 headers: { Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... }后端接收到的完整字符串是Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...而 jwt.verify() 只能解析纯 Token不含 Bearer 所以必须先提取。nodejs提取处理方式const jwt require(jsonwebtoken); function authenticateToken(req, res, next) { // 1. 获取 Authorization 头 const authHeader req.headers[authorization]; if (!authHeader) { return res.status(401).json({ error: 缺少 Authorization 头 }); } // 2. 提取 Token去掉 Bearer 前缀 const token authHeader.split( )[1]; // 分割后取第二部分 if (!token) { return res.status(401).json({ error: Token 格式错误 }); } // 3. 验证 Token try { const decoded jwt.verify(token, SECRET_KEY); req.user decoded; next(); } catch (err) { return res.status(403).json({ error: Token 无效或已过期 }); } }四、安全建议密钥安全SECRET_KEY必须保密不要提交到代码仓库HTTPS 传输防止 token 被中间人截获过期时间敏感操作用短过期15分钟长期登录用 Refresh Token不存敏感数据Payload 可被 Base64 解码不要放密码等敏感信息