TOP云提供高性价比云服务器租用,有中国内地/港澳台、海外等全球各地节点,TOP云国内云服务器只要有域名备案号就能直接用,无须重复备案;港澳台及海外云服务器不用备案,购买之后直接使用,省时省力省心。价格实惠,续费同价,2核2G5M仅需27元每月,8核8G50M仅需66元每月,更多配置套餐请进入下面网址了解:

TOP云总站云服务器:https://topyun.vip/server/buy.html

TOP云C站云服务器:https://c.topyun.vip/cart

在云服务器上实现 JWT(JSON Web Token)身份验证 是一种轻量级、无状态的认证方式,适用于 API 服务、前后端分离架构或微服务架构。JWT 由三部分组成:Header、Payload 和 Signature,通常用于在客户端和服务器之间安全地传递用户身份信息。


一、JWT 身份验证的基本流程

  1. 用户登录:客户端发送用户名和密码到服务器。

  2. 服务器验证:服务器验证用户凭据(如数据库查询)。

  3. 生成 JWT:验证成功后,服务器生成一个 JWT 并返回给客户端。

  4. 客户端存储 JWT:客户端(如浏览器、移动端)将 JWT 存储在 localStorage、sessionStorage 或 Cookie 中。

  5. 后续请求携带 JWT:客户端在后续 API 请求的 Authorization 头中携带 JWT(如 Bearer <token>)。

  6. 服务器验证 JWT:服务器解析并验证 JWT 的签名和有效期,决定是否允许访问。


二、在云服务器上实现 JWT 身份验证(以 Node.js + Express 为例)

1. 安装依赖

npm install express jsonwebtoken bcryptjs
  • jsonwebtoken:用于生成和验证 JWT。

  • bcryptjs:用于密码加密(存储用户密码时使用)。


2. 示例代码:JWT 身份验证实现

(1) 用户登录并生成 JWT

const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');

const app = express();
app.use(express.json()); // 解析 JSON 请求体

// 模拟用户数据库(实际应用中应使用数据库)
const users = [
  {
    id: 1,
    username: 'admin',
    password: bcrypt.hashSync('123456', 8), // 密码加密存储
  },
];

// JWT 密钥(应存储在环境变量中,避免硬编码)
const JWT_SECRET = 'your_jwt_secret_key';

// 登录接口
app.post('/login', (req, res) => {
  const { username, password } = req.body;

  // 查找用户
  const user = users.find((u) => u.username === username);
  if (!user) {
    return res.status(401).json({ message: '用户不存在' });
  }

  // 验证密码
  const passwordIsValid = bcrypt.compareSync(password, user.password);
  if (!passwordIsValid) {
    return res.status(401).json({ message: '密码错误' });
  }

  // 生成 JWT(有效期 1 小时)
  const token = jwt.sign(
    { id: user.id, username: user.username },
    JWT_SECRET,
    { expiresIn: '1h' }
  );

  res.json({ token });
});

(2) 受保护的 API 接口(验证 JWT)

// JWT 验证中间件
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({ message: '未提供 Token' });
  }

  jwt.verify(token, JWT_SECRET, (err, user) => {
    if (err) {
      return res.status(403).json({ message: 'Token 无效或已过期' });
    }
    req.user = user; // 将用户信息挂载到请求对象
    next();
  });
}

// 受保护的 API 接口
app.get('/protected', authenticateToken, (req, res) => {
  res.json({ message: '这是受保护的资源', user: req.user });
});

(3) 启动服务器

const PORT = 3000;
app.listen(PORT, () => { console.log(`Server running on http://localhost:${PORT}`);
});

三、客户端如何使用 JWT

  1. 登录获取 JWT

    curl -X POST http://your-server-ip:3000/login \
    -H "Content-Type: application/json" \
    -d '{"username": "admin", "password": "123456"}'

    返回示例:

    { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." }
  2. 访问受保护 API

    curl http://your-server-ip:3000/protected \
    -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."

四、JWT 的安全性最佳实践

  1. 使用 HTTPS:JWT 在传输过程中必须使用 HTTPS,防止中间人攻击。

  2. 设置合理的过期时间:expiresIn 不宜过长(如 1 小时或 1 天),避免 Token 泄露后长期有效。

  3. 不要存储敏感信息:JWT 是 Base64 编码的,可以被解码,因此不要在 Payload 中存储密码等敏感信息。

  4. 使用强密钥:JWT_SECRET 应足够复杂,建议使用环境变量存储(如 process.env.JWT_SECRET)。

  5. 考虑 Token 刷新机制:可以使用 refreshToken 机制,在 JWT 过期后重新获取新的 Token。

  6. 防止 CSRF 攻击:如果使用 Cookie 存储 JWT,需配合 SameSite 和 CSRF Token 防护。


五、JWT 适用场景

  • API 身份验证(如 RESTful API)

  • 前后端分离架构(如 Vue/React + Node.js)

  • 单点登录(SSO)

  • 微服务架构(服务间身份验证)


六、扩展:使用 Redis 存储 Token(可选)

如果需要实现 Token 黑名单(如用户注销后使 Token 失效),可以使用 Redis 存储 Token 并设置过期时间:

const redis = require('redis');
const client = redis.createClient();

// 注销接口:将 Token 加入黑名单
app.post('/logout', authenticateToken, (req, res) => {
  const token = req.headers['authorization'].split(' ')[1];
  client.setex(token, 3600, 'invalid'); // 1 小时后自动过期
  res.json({ message: '已注销' });
});

// 修改 JWT 验证中间件,检查 Token 是否在黑名单中
function authenticateToken(req, res, next) {
  const token = req.headers['authorization'].split(' ')[1];
  client.get(token, (err, reply) => {
    if (reply === 'invalid') {
      return res.status(403).json({ message: 'Token 已失效' });
    }
    jwt.verify(token, JWT_SECRET, (err, user) => {
      if (err) return res.status(403).json({ message: 'Token 无效' });
      req.user = user;
      next();
    });
  });
}


总结

  • JWT 是无状态的,服务器不需要存储 Session,适合分布式系统。

  • 安全性依赖密钥和 HTTPS,需妥善管理 JWT_SECRET。

  • 适用于 API 认证,但不适合需要强制注销的场景(需结合 Redis 实现黑名单)。

如果你使用的是其他语言(如 Python Flask、Java Spring Boot、Go Gin),也可以类似实现 JWT 认证。


不容错过
Powered By TOPYUN 云产品资讯