从NodeJS在TCP服务器上实现简单身份验证

时间:2011-07-21 17:05:47

标签: sockets authentication node.js tcp

我几乎可以肯定我不理解TCP服务器的基本概念,而且我不会将数据视为流,更糟糕的是,我可能没有很好地使用这些事件。

我希望tcp服务器写入套接字'username:',然后您可以输入您的用户名(在netcat或telnet等tcp客户端上),然后tcp服务器必须将下一个数据视为用户名。到目前为止它确实有效(虽然我几乎可以肯定有更好的方法可以做到这一点),然后它应该写'密码:'所以你可以输入你的密码,如果它是正确的,它应该验证凭据和执行更多操作......但是当您输入密码时,会再次写入“密码:”,因为socket.write('password: ');本身位于另一个socket.on('data',function(){//etc});

这是我到目前为止的代码:

var net = require('net');

var server = net.createServer(function (socket) {
    socket.addListener("connect", function () {
        socket.write('username: ');
        socket.on('data',function(data){
            var username = data.toString().replace('\n','');
            socket.write('password: ');
            socket.on('data',function(data){
                var password = data.toString().replace('\n','');
                // verify authentication here
                // Do more stuff
            });
        });
    });
});

server.listen('8000','localhost');

实现这个的正确方法是什么?我只是实现了这个,因为我需要接收可能没有结尾的上传(流),而不是一次全部。尝试用TCP服务器解决这个问题,我真的很蠢吗?

提前致谢。

1 个答案:

答案 0 :(得分:2)

您可以使用节点ftp server来源作为参考。

代码中的主要问题:stream'data'事件会将传入的数据拆分为块。例如,如果客户端发出两次写入('用户名:u \ n')和写入('密码:p \ n'),您可以预期数据内容可以是“用户名:u \ npassword:p \ n”到25 '数据'事件与'你','s','e','r'等数据缓冲区。您需要缓冲传入的块或使用状态机。