我最近设置了一个nodejs聊天服务器,聊天客户端由php服务器提供服务。当用户登录时,他们的会话将存储在php服务器的mysql中,登录cookie将附加到浏览器。
我想限制只有登录用户才能聊天的用户。实现这一目标的最佳做法是什么?
我的想法很快:
当加载聊天客户端时,如果用户登录,我将通过套接字将登录cookie信息发送到nodejs verver。然后创建一个nodejs会话。当用户聊天时,消息连同cookie信息将通过socket发送到nodejs服务器。如果cookie信息与nodejs会话不匹配,则不会广播该消息,并且将终止客户端套接字。
答案 0 :(得分: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));
}
});
答案 1 :(得分:0)