Socket.io-为私有消息传递实现用户套接字关联映射



我正在尝试使用socket.io 创建一个私人消息系统

为了将用户与他们的套接字关联起来,大多数网站都建议这样做:

var people = {};
client.on('connection', function(socket) {
    //join the server
    socket.on('add user', function(user_id) {
        //create user-socket map
        people[user_id] = socket.id;
    });
});

在我看来,上面代码的问题是user_id是从客户端发送的,所以如果用户以某种方式修改它并发送另一个user_id,就会发生模拟。

此外,我无法在client.on('connection'...下访问req.user._id,那么我应该如何从服务器端获得user_id?我正在使用node.js、passport和express。

我将使用jsonwebtokensocketio-jwt模块来解决此安全问题。

服务器:

var secret = 'shhhhhh';
app.get('/getJWT', function(req, res) {
    /* Do your authentication here using header and get the userId */
    var userId = 'someId';
    var jwt = require('jsonwebtoken');
    var token = jwt.sign({ 'userId': userId }, secret);
    res.json({
        token: token
    });
});
var socketioJwt = require('socketio-jwt');
io.use(socketioJwt.authorize({
    secret: secret,
    handshake: true
}));
io.sockets.on('connection', function (socket) {
    var userId = socket.decoded_token.userId;
    /* your logic */

客户:

var token = "token you got from the /getJWT"
var c = io.connect('http://localhost:3000/', { query: "token=" + token });

由于令牌是用秘密编码的,客户端无法更改和发送它

请参阅本文,了解为什么这样做更好。

您错过了最重要的部分。。。你的代码必须验证usr是他说的那个人。简单明了。我有多种方法:

如果用户通过PHP代码登录,我会将会话数据移动到mysql数据库中。然后,我在PHP端使用一个字符串来生成对客户端的挑战的响应,客户端将其发送到我的web套接字服务器。WS服务器将询问客户端,并在mysqldb中查找会话信息。完成。

在我最近的开发中,实际登录过程是通过web套接字服务器完成的。我通过任何DB(在我的实例中是MySQL)验证用户凭据,并将用户名绑定到套接字。已完成。。。

不要仅仅依靠基于javascript的网站来说"我的名字是"。否则,正如你所说,用户模仿就成了公园里的散步。如果你正在实现一个重要的系统,你必须验证用户是他所说的那个人。"Web套接字"本身并不是为您实现这一点的神奇组件。

var people将可在同一进程上访问。

当您想使用多个套接字服务器进行扩展并在它们之间进行平衡时,这种将人员对象保持在本地的想法将没有帮助。

创建用于身份验证的authenticate事件,并设置socket.userIdsocket.isAuthenticate = true标志。在其他事件中,如果socket.isAuthenticate为false,则将其踢出。

使用"socket.io redis"适配器在多个socket.io服务器之间进行通信。(因此,当服务器1中的user1向服务器2中的user2发送消息时,将起作用)。

对于具有多个进程的套接字用户关联,您可以使用他们的userId加入Room,在身份验证时,加入类似socket.join('myuserId');的Room

以及何时向该用户发送消息,您可以使用io.to('myuserId').emit('message', "Hi How are you?"):

您可以在套接字连接上发送其他数据,如下所示:

 client side :
     var c = io.connect('http://localhost:3000/', { query: "userId=value01" });

server side :
 // extract userId param from connected url
 io.on('connection', function(socket) {
      var socket_param_userId = socket.handshake['query']['userId'];
      console.log(socket_param_userId);  //show value01
});

相关内容

  • 没有找到相关文章

最新更新