2011-04-21 87 views
7

我最近设置了一个nodejs聊天服务器,聊天客户端由php服务器提供服务。当用户登录时,他们的会话将存储在php服务器的mysql中,并且登录cookie将附加到浏览器。Node.js聊天 - 用户认证

我想限制只有登录用户才能聊天的用户。实现这个目标的最佳实践是什么?

我快的想法:

当聊天客户端下载,如果用户登录,我会将登录cookie信息来通过的NodeJS插座verver。然后创建一个nodejs会话。当用户聊天时,消息连同cookie信息将通过套接字发送到nodejs服务器。如果cookie信息与nodejs会话不匹配,则消息将不会被广播,客户端套接字将被退出。

+0

的可能重复[Node.js的如何创建和读取Express会话(HTTP答案:// stackoverflow.com/questions/5765777/node-js-how-to-create-and-read-session-with-express) – jmort253 2012-03-05 06:28:58

回答

3

websocket是一个永久性的开放连接。连接到WebSocket时,您只需要验证一次。

只需将您的登录cookie发送给node.js一次,并通过引用套接字连接将其存储在服务器上。然后只处理来自已认证用户的消息,并仅向经过认证的用户进行广播。

问题是客户端用户可以很容易地伪造这个cookie,因为节点不会与php通话以确保它是有效的登录cookie。

使用now的示例。

警告虚拟代码

// server.js 
everyone.now.joinChat = function(cookie) { 
    chat.add(this, cookie); 
} 

everyone.now.serverMessage = function(message) { 
    if (chat.hasUser(this)) { 
     chat.broadcast(message); 
    } 
} 

chat = (function() { 
    var users = []; 

    return { 
     "add": function(client) { 
      users.push(client); 
     }, 
     "hasUser": function(client) { 
      return users.some(function(user) { 
       return user === client; 
      }); 
     }, 
     "broadcast": function(message) { 
       users.each(function(user) { 
        user.clientMessage(message); 
       }); 
     } 
    } 
}()); 

// client.js 
$(function() { 
    now.joinChat($.cookie("login")); 

    $("#send").click(function() { 
     now.serverMessage($(this).data("message")); 
    }); 

    now.clientMessage = function(message) { 
     $("#messages").append($("<span></span>").text(message)); 
    } 

}); 
+0

“将它存储在服务器上并引用套接字连接”可以举例说明去做这个 ? – 2011-04-21 15:18:50

+0

@runrunforest now.js可以为你做到这一点。我会写一个例子。你可以使用socket.io来做同样的事情,你可以使用你自己的websocket实现,只需要自己编写详细的细节。 – Raynos 2011-04-21 15:22:23