如何在 Node.js 上使用 JWT 进行身份验证
发布: (2026年1月15日 GMT+8 00:49)
3 min read
原文: Dev.to
Source: Dev.to

什么是 JWT?
JWT(JSON Web Token) 是一种紧凑的、URL 安全的令牌,用于在各方之间安全传输信息。
JWT 看起来像这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
它由三部分组成:
HEADER.PAYLOAD.SIGNATURE
JWT 结构
Header(头部)
包含令牌类型和签名算法。
{
"alg": "HS256",
"typ": "JWT"
}
Payload(负载)
包含用户数据(声明)。
{
"id": 42,
"email": "user@example.com"
}
⚠️ 切勿在负载中存储密码或其他敏感数据。
Signature(签名)
用于验证令牌未被篡改。
HMACSHA256(base64UrlHeader + "." + base64UrlPayload, secret)
JWT 认证工作原理
- 用户使用邮箱和密码登录。
- 服务器验证凭证。
- 服务器生成一个 JWT。
- 客户端存储 JWT(通常在内存或 HTTP‑only Cookie 中)。
- 客户端在
Authorization头部发送 JWT。 - 服务器在每个请求上验证 JWT。
在 Node.js(Express)中实现 JWT 认证
安装依赖
npm install express auth-verify
登录时生成(签名)JWT
const AuthVerify = require('auth-verify');
const auth = new AuthVerify({
jwtSecret: "SUPER_SECRET" // 用于签名 JWT 的密钥
});
// 生成一个 1 小时后过期的 JWT
auth.jwt.sign({ userId: 1, user: "John Doe" }, "1h");
登录路由示例
const express = require('express');
const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
const AuthVerify = require('auth-verify');
const auth = new AuthVerify({ jwtSecret: "SUPER_SECRET" });
app.post('/login', async (req, res) => {
const { email, password } = req.body;
const user = await findUserByEmail(email);
if (!user) return res.status(401).json({ message: 'Invalid credentials' });
const isValid = await auth.crypto.verify(password, user.password);
if (!isValid) return res.status(401).json({ message: 'Invalid credentials' });
const token = await auth.jwt.sign({ userId: user.id, user: user.name }, "1h");
res.json({ token });
});
使用 JWT 中间件保护路由
auth.jwt.protect(); // 返回 Express 中间件
受保护的路由示例
app.get('/profile', auth.jwt.protect(), (req, res) => {
res.json({
message: 'Welcome!',
user: req.user
});
});
客户端发送 JWT
Authorization: Bearer YOUR_JWT_TOKEN
常见的 JWT 错误
- ❌ 将 JWT 存放在
localStorage(存在 XSS 风险) - ❌ 在负载中放入敏感数据
- ❌ 未设置令牌过期时间
- ❌ 使用弱密码(密钥)
最佳实践
- ✅ 尽可能使用 HTTP‑only Cookie
- ✅ 始终设置
expiresIn(或exp声明) - ✅ 在生产环境中定期轮换密钥
何时应该使用 JWT?
适合的场景:
- 无状态 API
- 微服务架构
- 移动端或 SPA 认证
不太适合的情况:
- 需要在所有客户端即时注销
- 需要复杂的会话控制
结论
JWT 提供了一种简单、可扩展且无状态的认证方式。
正确使用时,它既强大又安全。如果你在构建 API、SPA 或移动应用——掌握 JWT 是值得的。