您是对的,您无法阻止人们使用socket.io-client 使用自定义脚本手动连接到您的 socket.io 服务器。通常这是您以某种方式设计服务器的原因,即连接的客户端套接字不会造成任何伤害。客户端套接字通常在接收端。
当然,关于如何验证连接客户端的最佳实践,如果验证失败,则阻止连接。查看socket.io Documentation 关于client options。有一个auth 字段可用:
客户
import { io } from "socket.io-client";
const socket = io({
auth: {
token: "abcd"
}
});
服务器
io.on("connection", (socket) => {
console.log(socket.handshake.auth); // prints { token: "abcd" }
});
因此,一旦用户登录,使用 JWT(令牌)(假设您有 JWT 身份验证)并在建立连接期间传递它。然后在服务器端验证 JWT。
客户端证书认证
还有a more advanced 选项用于使用证书的客户端身份验证:
客户
const fs = require("fs");
const socket = require("socket.io-client")("https://example.com", {
ca: fs.readFileSync("./server-cert.pem"),
cert: fs.readFileSync("./client-cert.pem"),
key: fs.readFileSync("./client-key.pem"),
});
服务器
const fs = require("fs");
const server = require("https").createServer({
cert: fs.readFileSync("./server-cert.pem"),
key: fs.readFileSync("./server-key.pem"),
requestCert: true,
ca: [
fs.readFileSync('client-cert.pem')
]
});
const io = require("socket.io")(server);