在Socket.io中进行身份validation

我将尝试在socket.io上validation连接。

目前,用户首先通过REST API进行身份validation,然后向用户发送带有经过身份validation的用户名的JsonWebToken 。 当我打开客户端和服务器之间的连接后,我的计划是暂时从连接的套接字列表中删除这个套接字,以防止服务器之间的数据接收和发送,而我执行身份validation。

在这个validation中,我validation令牌,如果令牌是有效的,我重新添加套接字的id到连接的套接字列表。 唯一的问题是第一部分不起作用。 我似乎无法从列表中删除套接字。

为了testing这个我做了以下。

 io.on('connection', function(socket){ //temp delete socket delete io.sockets.connected[socket.id]; console.log(io.sockets.connected); socket.emit("test"); }); 

正如你所看到的,我删除了套接字,并发出一个testing事件来查看套接字是否仍然打开。 客户收到的消息不应该是。

有谁知道这是为什么发生?

尝试从套接字对象中使用disconnect方法,如下所示:

 io.on('connection', function(socket){ //temp delete socket socket.disconnect(); console.log(io.sockets.connected); socket.emit("test"); }); 

更新:

例如,如果您的HTTP服务器给客户端一个令牌:

 app.post('/api/users', function (req, res) { var user = { username: req.body.username }; var token = jwt.sign(user, secret, {expiresInMinutes: 30}); res.json({token: token}); }); 

那么你可以重用该令牌来validation你的websocket连接。

从客户端(HTML文件)发送代码令牌将是:

 socket = io.connect('http://localhost:4000', { query: 'token=' + validToken, forceNew: true }); 

而服务器(socketio)中的socketio授权码将为:

 // here is being used a socketio middleware to validate // the token that has been sent // and if the token is valid, then the io.on(connection, ..) statement below is executed // thus the socket is connected to the websocket server. io.use(require('socketio-jwt').authorize({ secret: secret, handshake: true })); // but if the token is not valid, an error is triggered to the client // the socket won't be connected to the websocket server. io.on('connection', function (socket) { console.log('socket connected'); }); 

请注意,在express上使用的秘密来生成一个令牌,在socketio中间件的validation令牌上也使用相同的令牌。

我已经创build了一个例子,你可以看到这种validation如何工作,源代码在这里: https : //gist.github.com/wilsonbalderrama/a2fa66b4d2b6eca05a5d

将它们复制到一个文件夹中,然后使用节点运行server.js,然后从该URL的浏览器访问该html文件: http:// localhost:4000

但首先安装模块:socket.io,express,socketio-jwt,jsonwebtoken

socket.io也将套接字保存在一个名称空间中(如果未指定,则默认为缺省值),并且在那里您需要删除它以停止接收消息。

看到这个post一步一步解释你想要做什么, 这个模块 ,抽象的整个过程。