在之前的文章中,我们探讨了如何通过 WebSockets + DTOs 设计实时操作。现在,我们迎来了一项新的挑战:确保 WebSocket 通信在任务执行过程中保持安全。如果敌方潜伏在我们的实时通信渠道中,机密情报可能会被泄露。
任务: 实现 JWT 认证,确保只有 授权特工 能访问我们的网络。我们开始行动!
WebSockets 允许 即时双向通信,但如果没有适当的安全措施,敌方特工可能会:
🔹 你的目标: 在建立连接之前,使用 JWT 对每个特工进行 身份认证!
在特工能够访问 WebSocket 任务频道之前,必须先进行身份认证并获得授权。
特工在成功认证后,服务器会将 JWT 令牌作为 HTTP-only Cookie 返回给客户端。 更安全的方法: 服务器 设置一个 HTTP-only cookie,确保它随着请求自动发送。
示例 HTTP 响应(使用 Cookie 方法):
HTTP/1.1 200 OK
Set-Cookie: jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...; HttpOnly; Secure; SameSite=Strict
客户端示例(无需手动存储 JWT):
fetch("https://hq-secure.com/api/auth/login", {
method: "POST",
credentials: "include", // 确保发送 Cookie
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ username: "AgentX", password: "TopSecret123" }),
})
.then(response => {
if (response.ok) console.log("登录成功,JWT 存储在 HttpOnly Cookie 中!");
})
.catch(error => console.error("认证失败", error));
缺点: WebSockets 不会自动附带 Cookie,因此客户端需要 手动获取 JWT,并在连接 WebSocket 时附上。
一旦认证通过,特工必须在建立 WebSocket 连接时提供 JWT 令牌。
通过强制 基于 JWT 的认证,我们确保只有 授权特工 可以访问任务数据,同时维持 安全的实时通信。
npm install express socket.io jsonwebtoken cors
const jwt = require("jsonwebtoken");
const SECRET_KEY = "top_secret_mission_code"; // 🔥 保持机密!
// 生成安全的授权令牌
function generateToken(agent) {
return jwt.sign({ id: agent.id, codename: agent.codename }, SECRET_KEY, { expiresIn: "1h" });
}
// 验证特工授权
function verifyToken(token) {
try {
return jwt.verify(token, SECRET_KEY);
} catch (err) {
return null;
}
}
const express = require("express");
const http = require("http");
const { Server } = require("socket.io");
const app = express();
const server = http.createServer(app);
const io = new Server(server, { cors: { origin: "*" } });
// 安全的 WebSocket 通信
io.use((socket, next) => {
const token = socket.handshake.auth.token;
const agent = verifyToken(token);
if (!agent) return next(new Error("未经授权的访问 - 授权失败!"));
socket.agent = agent; // 将特工信息附加到会话
next();
});
io.on("connection", (socket) => {
console.log(`特工已连接: ${socket.agent.codename}`);
socket.on("message", (msg) => {
console.log(`来自 ${socket.agent.codename} 的传输: ${msg}`);
});
socket.on("disconnect", () => {
console.log(`特工断开连接: ${socket.agent.codename}`);
});
});
server.listen(3000, () => console.log("安全 WebSocket 总部在端口 3000 上运行"));
✅ 现在,只有经过验证的特工才能建立安全的通信通道!
npm install socket.io-client
import { io } from "socket.io-client";
const clearanceToken = localStorage.getItem("jwt"); // 获取安全令牌
const socket = io("http://localhost:3000", {
auth: { token: clearanceToken },
});
socket.on("connect", () => {
console.log("✅ 与总部建立了安全通道!");
});
socket.on("message", (msg) => {
console.log("收到的传输:", msg);
});
socket.on("disconnect", () => {
console.log("安全通道丢失!正在重试...");
});
✅ 现在,只有拥有有效清除令牌的特工才能访问任务更新!
✅ 使用 HTTP-only Cookies 存储 JWT(防止敌人 XSS 攻击)。 ✅ 设置短生命周期令牌(例如 1 小时有效期),以减少安全风险。 ✅ 实施刷新令牌,以便令牌过期后,特工能够重新认证。 ✅ 加密 WebSocket 通道(WSS) 使用 SSL/TLS 保障通信安全。 ✅ 监控并记录所有 WebSocket 连接,以检测可疑活动。
Apipost 是一款强大的工具,可帮助你实时测试、调试和监控 WebSocket 通信。
安全特性 | 任务收益 |
---|---|
JWT 认证 | 确保只有授权特工可以连接 |
无 API 轮询需求 | 减少总部服务器负担 |
安全的实时更新 | 保护机密情报 |
持久身份 | 保持断开重连后的会话 |
总部指令: 你现在具备了利用 JWT 和 WebSockets 构建 安全实时网络 的能力。将这一策略部署到实战中,确保没有未经授权的访问!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。