【问题标题】:Implementing simple authentication on a TCP Server from NodeJS从 NodeJS 在 TCP 服务器上实现简单的身份验证
【发布时间】:2012-03-28 07:23:49
【问题描述】:

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

我希望 tcp 服务器写入套接字“用户名:”,这样您就可以输入您的用户名(在像 netcat 或 telnet 这样的 tcp 客户端上),然后 tcp 服务器必须将下一个数据视为用户名。到目前为止它确实有效(尽管我几乎可以肯定有更好的方法来做到这一点),接下来它应该写 'password:' 这样你就可以输入你的密码,如果它是正确的,那么它应该验证凭据并做更多的事情...但是发生的情况是,当您输入密码时,它会再次写入“密码:”,因为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 服务器解决这个问题,我真的很愚蠢吗?

提前致谢。

【问题讨论】:

  • 只是一个快速的答案:尝试 .once 或 .one 而不是 on,这应该只会触发每个回调一次。给出的答案也是正确的,并且是一个更完整的解决方案。

标签: sockets authentication node.js tcp


【解决方案1】:

您可以使用 node ftp server source 作为参考。

代码中的主要问题:流“数据”事件将传入的数据分成块。例如,如果客户端发出两个 write('username: u\n') 和 write('password: p\n') 你可以期望数据内容是从 'username: u\npassword: p\n' 到 25带有“u”、“s”、“e”、“r”等数据缓冲区的“数据”事件。您需要缓冲传入的块或使用状态机。

【讨论】:

    猜你喜欢
    • 2021-12-05
    • 2016-04-19
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多