2011-04-21 78 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