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 身份验证的基本流程
用户登录:客户端发送用户名和密码到服务器。
服务器验证:服务器验证用户凭据(如数据库查询)。
生成 JWT:验证成功后,服务器生成一个 JWT 并返回给客户端。
客户端存储 JWT:客户端(如浏览器、移动端)将 JWT 存储在 localStorage、sessionStorage 或 Cookie 中。
后续请求携带 JWT:客户端在后续 API 请求的 Authorization 头中携带 JWT(如 Bearer <token>)。
服务器验证 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
登录获取 JWT:
curl -X POST http://your-server-ip:3000/login \ -H "Content-Type: application/json" \ -d '{"username": "admin", "password": "123456"}'
返回示例:
{ "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." }
访问受保护 API:
curl http://your-server-ip:3000/protected \ -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
四、JWT 的安全性最佳实践
使用 HTTPS:JWT 在传输过程中必须使用 HTTPS,防止中间人攻击。
设置合理的过期时间:expiresIn 不宜过长(如 1 小时或 1 天),避免 Token 泄露后长期有效。
不要存储敏感信息:JWT 是 Base64 编码的,可以被解码,因此不要在 Payload 中存储密码等敏感信息。
使用强密钥:JWT_SECRET 应足够复杂,建议使用环境变量存储(如 process.env.JWT_SECRET)。
考虑 Token 刷新机制:可以使用 refreshToken 机制,在 JWT 过期后重新获取新的 Token。
防止 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 认证。