Node.js聊天室-用户认证

7
我最近搭建了一个Node.js聊天服务器,聊天客户端由PHP服务器提供。当用户登录时,他们的会话将存储在PHP服务器的MySQL中,并附加一个登录cookie到浏览器。
我想限制只有已登录的用户才能聊天。如何最好地实现这一点?
我的快速想法:
当聊天客户端加载时,如果用户已登录,我将通过socket将登录cookie信息发送到Node.js服务器。然后创建一个Node.js会话。当用户聊天时,消息连同cookie信息将通过socket发送到Node.js服务器。如果cookie信息与Node.js会话不匹配,则消息将不会被广播,并且客户端socket将断开连接。

可能是重复的问题:node.JS如何使用express创建和读取会话 - jamesmortensen
2个回答

3

WebSocket是一个永久开放的连接。当您连接到WebSocket时,只需要进行一次身份验证。

只需将登录cookie发送到node.js一次,并将其与套接字连接的引用存储在服务器上。然后仅处理来自经过身份验证的用户的消息,并仅广播给经过身份验证的用户。

问题在于客户端用户可以轻易伪造此cookie,因为node不会与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));
    }

});

将其存储在服务器上,并引用套接字连接。你能举个例子吗? - angry kiwi
@runrunforest,现在.js可以为您完成此操作。我将编写一个示例。您也可以使用socket.io完成相同的操作,或者使用自己的websocket实现,只需自己编写细节即可。 - Raynos

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接