第十二章 nodejs Jwt

72 阅读3分钟

JSON Web Token(JWT)是一种用于在网络上安全地传输信息的开放标准(RFC 7519)。JWT 可以包含用户身份、权限信息以及其他任何需要传输的信息,并使用数字签名或加密进行安全验证。以下是有关 Node.js 中 JWT 的详细解释,包括创建、验证和使用 JWT 的每个步骤,以及一个实际的商业案例。

1. 什么是 JWT?

JWT 是一种用于安全传输信息的令牌,它包含三个部分:

  • Header(头部) :包含令牌的类型(即 JWT)和所使用的签名算法(例如 HMAC SHA256 或 RSA)。
  • Payload(负载) :包含声明(claim),声明是关于实体(通常是用户)和其他数据的声明。有三种类型的声明:注册声明、公共声明和私有声明。
  • Signature(签名) :用于验证消息在传输过程中是否被篡改。签名由头部、负载和一个秘密密钥组成。

2. 创建 JWT

在 Node.js 中,您可以使用 jsonwebtoken 库来创建 JWT。以下是一个创建 JWT 的示例:

const jwt = require('jsonwebtoken');
​
// 用户信息
const user = {
  id: 123,
  username: 'example_user',
};
​
// 生成 JWT
const token = jwt.sign(user, 'your_secret_key', { expiresIn: '1h' });

上述代码创建了一个包含用户信息的 JWT,并指定了一个密钥以及令牌的过期时间。

3. 验证 JWT

验证 JWT 的过程包括检查签名以及可选地检查过期时间和其他声明。以下是一个验证 JWT 的示例:

const jwt = require('jsonwebtoken');
​
// 接收到的令牌
const token = 'received_token_here';
​
// 验证令牌
jwt.verify(token, 'your_secret_key', (err, decoded) => {
  if (err) {
    // 令牌无效或已过期
    console.error('Token invalid or expired');
  } else {
    // 令牌有效,包含用户信息
    console.log('Decoded user:', decoded);
  }
});

上述代码验证了接收到的 JWT,如果令牌有效,则将用户信息解码并输出。

商业案例:实际示例

假设您正在构建一个在线商店应用程序,需要使用 JWT 来进行用户身份验证和授权。以下是一个示例,展示如何使用 JWT 来验证用户身份和授予访问权限:

const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
const port = 3000;
​
// 密钥,用于签名和验证 JWT
const secretKey = 'your_secret_key';
​
// 用户数据库
const users = [
  { id: 1, username: 'user1', password: 'password1' },
  { id: 2, username: 'user2', password: 'password2' },
];
​
// 登录路由:生成 JWT
app.post('/login', (req, res) => {
  const { username, password } = req.body;
  const user = users.find((u) => u.username === username && u.password === password);
​
  if (!user) {
    return res.status(401).send('Authentication failed');
  }
​
  const token = jwt.sign({ userId: user.id, username: user.username }, secretKey, {
    expiresIn: '1h',
  });
  res.json({ token });
});
​
// 受保护的路由:验证 JWT
app.get('/protected', (req, res) => {
  const token = req.headers.authorization?.split(' ')[1];
  if (!token) {
    return res.status(401).send('Unauthorized');
  }
​
  jwt.verify(token, secretKey, (err, decoded) => {
    if (err) {
      return res.status(401).send('Invalid token');
    }
​
    // 用户已验证,可以访问受保护的资源
    res.json({ message: 'Protected resource accessed', user: decoded });
  });
});
​
app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

在上述示例中,用户可以通过 /login 路由登录并获取 JWT。然后,他们可以使用 JWT 来访问 /protected 路由中的受保护资源。

这是一个简单的商业案例,演示了如何在 Node.js 中使用 JWT 来进行用户身份验证和授权。JWT 是一种非常有用的工具,可用于各种应用程序中,确保数据传输的安全性和完整性