在客户端应用程序可以成功建立与Node服务器(例如,Electron应用程序)的连接之前进行检查的最佳方法是什么。
建议从websocket / ws库中的Ipinca 建议使用server.on('upgrade',...)事件侦听器,但是使用此方法,我们只能检查客户端当前发送的数据。
const http = require('http');
const WebSocket = require('ws');
const server = http.createServer();
const wss = new WebSocket.Server({ noServer: true });
wss.on('connection', function connection(ws, request, ...args) {
// ...
});
server.on('upgrade', async function upgrade(request, socket, head) {
// Do what you normally do in `verifyClient()` here and then use
// `WebSocketServer.prototype.handleUpgrade()`.
let args;
try {
args = await getDataAsync();
} catch (e) {
socket.destroy();
return;
}
wss.handleUpgrade(request, socket, head, function done(ws) {
wss.emit('connection', ws, request, ...args);
});
});
server.listen(8080);
但是,如果我们要检查用户是否已经通过身份验证,而在这种情况下,我们不想再次对他进行身份验证,该怎么办?在打开WebSocket连接进行这些检查之前,我们是否需要发送一些http请求,并且将Ws和Http协议使用相同的端口是一种好习惯吗?
谢谢!
答案 0 :(得分:0)
如果用户通过身份验证但建立新连接,此代码可帮助您建立连接。 我认为在你的情况下,如果用户已经通过身份验证,那么你会尝试做,如果没有,则建立连接,然后让他注册。
答案 1 :(得分:0)
如果您之前已经对用户进行了身份验证,并且他们携带了标识他们的 cookie,则您可以从 request
或 server.on('upgrade'...
事件处理程序的 wss.on('connection'...
参数中访问该数据作为节点的 http.IncomingMessage 类的实例(或类似的东西,无论如何)。
您可以将请求对象本身或来自 request.headers.cookie
的 cookie 问题与您的身份验证解决方案(无论是中间件还是自行开发)一起使用,以验证用户应该能够继续,就像您在一个 HTTP 路由。