如何在 Node.js 上使用 JWT 进行身份验证

发布: (2026年1月15日 GMT+8 00:49)
3 min read
原文: Dev.to

Source: Dev.to

Cover image for How to use JWT for authentication on Node.js

什么是 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 认证工作原理

  1. 用户使用邮箱和密码登录。
  2. 服务器验证凭证。
  3. 服务器生成一个 JWT。
  4. 客户端存储 JWT(通常在内存或 HTTP‑only Cookie 中)。
  5. 客户端在 Authorization 头部发送 JWT。
  6. 服务器在每个请求上验证 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 是值得的。

Back to Blog

相关文章

阅读更多 »

Academic Suite 身份验证与授权

3.1 Academic Suite 中的身份验证方法 Academic Suite 使用基于 JSON Web Token(JWT)的无状态身份验证方法。不同于基于会话的身份验证…

了解 JSON Web Token (JWT)

在创建 Web 应用程序的某个时刻,我们需要为系统开发一个认证解决方案。有多种策略可以实现,例如 aute...