在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一步一步解释你想要做什么, 这个模块 ,抽象的整个过程。