Аутентификация на TCP-сервере очень низкого уровня, написанном для Node.JS? - PullRequest
0 голосов
/ 26 мая 2011

Как мне реализовать нечто похожее на обычную аутентификацию HTTP на сервере TCP, написанном для Node.JS? Код для основного TCP-сервера следующий:

// Load the net module to create a tcp server.
var net = require('net');

// Setup a tcp server
var server = net.createServer(function (socket) {

  // Every time someone connects, tell them hello and then close the connection.
  socket.addListener("connect", function () {
    console.log("Connection from " + socket.remoteAddress);
    socket.end("Hello World\n");
  });

});

// Fire up the server bound to port 7000 on localhost
server.listen(7000, "localhost");

// Put a friendly message on the terminal
console.log("TCP server listening on port 7000 at localhost.");

1 Ответ

5 голосов
/ 26 мая 2011

Хотя существует несколько способов обеспечить аутентификацию по TCP-соединению, для всех требуется определенная форма «протокола», являющегося согласованной грамматикой / синтаксисом связи.

Например, в Simple Mail Transport Protocol происходит следующий диалог (где S: и C: обозначают строки, предоставляемые SMTP-сервером и почтовым клиентом соответственно):

S: 220 server.example.com
C: HELO client.example.com
S: 250 server.example.com
C: MAIL FROM:<sender@example.com>
S: 250 2.1.0 sender@example.com... Sender ok
C: RCPT TO:<recipient@example.com>
S: 250 recipient <recipient@example.com> OK
C: DATA
S: 354 enter mail, end with line containing only "."
C: full email message appears here, where any line
C: containing a single period is sent as two periods
C: to differentiate it from the "end of message" marker
C: .
S: 250 message sent
C: QUIT
S: 221 goodbye

В ответах с сервера начальное числовое значение указывает на успех или неудачу запрошенной операции или на то, что ответ содержит информационное сообщение. Использование трехзначного числового значения обеспечивает эффективный синтаксический анализ, поскольку все ответы, начинающиеся с 2xx, указывают на успешность, 3xx являются информационными, 4xx указывают на ошибки протокола, а 5xx зарезервированы для ошибок сервера. См. IETF RFC 5321 - http://tools.ietf.org/html/rfc5321 для полного протокола.

Итак, в вашем конкретном случае вы можете рассмотреть что-то простое:

[connect to TCP server]
S: ?                    # indicates the server is ready for authorization

C: username password   # send authentication credentials

Затем сервер ответит:

S: !                    # indicates successful authentication and 
                        # that server is ready for more commands 

Или

S: ?                    # indicates authentication failure

Если обнаружено слишком много неудачных попыток аутентификации, сервер может разорвать соединение, чтобы уменьшить вероятность злоупотреблений, таких как DDOS-атаки.

После аутентификации клиент может отправить:

C: >                    # begin streaming

Или любая другая команда, которую вы поддерживаете.

...