2011-05-26 3 views
0

Comment implémenter quelque chose de similaire à l'authentification HTTP Basic, dans un serveur TCP écrit pour Node.JS? Le code pour un serveur TCP de base est le suivant:Authentification sur un serveur TCP de très bas niveau écrit pour Node.JS?

// 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."); 
+0

duplication possible de [Authentification HTTP de base dans Node.JS?] (Http://stackoverflow.com/questions/5951552/basic-http-authentication-in-node-js) –

+0

J'espère ne pas ... Auparavant, je J'ai demandé une authentification http de base pour un serveur HTTP, et maintenant je demande quelque chose de similaire à l'authentification HTTP de base, mais dans un serveur TCP. Comment les utilisateurs s'authentifient-ils lors de la connexion à un serveur TCP avec netcat ou par exemple? Comment puis-je vérifier les authentifications? –

+0

Vous devez implémenter le protocole HTTP (ou un sous-ensemble de). Consultez la rfc HTTP1.1 ici: http://www.w3.org/Protocols/rfc2616/rfc2616.html. C'est la reconstruction de la roue, donc à moins que ce soit un exercice académique, je ne peux pas imaginer pourquoi vous voudriez le faire .. –

Répondre

5

Bien qu'il existe plusieurs façons de fournir l'authentification via une connexion TCP, tous nécessitent une certaine forme de « protocole » étant un convenu grammaire/syntaxe communication.

Par exemple, dans le Simple Mail Transport Protocol, la conversation suivante a lieu (où S: et C: lignes désignent fournies par le serveur SMTP et client de messagerie, respectivement):

S: 220 server.example.com 
C: HELO client.example.com 
S: 250 server.example.com 
C: MAIL FROM:<[email protected]> 
S: 250 2.1.0 [email protected] Sender ok 
C: RCPT TO:<[email protected]> 
S: 250 recipient <[email protected]> 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 

Dans les réponses de la serveur, la valeur numérique initiale indique le succès ou l'échec de l'opération demandée ou la réponse contient un message d'information. L'utilisation d'une valeur numérique à trois chiffres permet une analyse efficace car toutes les réponses commençant par 2xx indiquent le succès, 3xx sont informatives, 4xx indiquent des erreurs de protocole et 5xx sont réservées aux erreurs de serveur. Voir IETF RFC 5321 - http://tools.ietf.org/html/rfc5321 pour le protocole complet.

Donc, dans votre cas, vous pourriez envisager quelque chose d'aussi simple que:

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

C: username password # send authentication credentials 

Le serveur alors répondre avec:

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

Ou

S: ?     # indicates authentication failure 

Si un trop grand nombre Si des tentatives d'authentification infructueuses sont constatées, le serveur peut interrompre la connexion pour réduire les risques d'abus, tels que comme des attaques DDOS.

Une fois authentifié, le client peut envoyer:

C: >     # begin streaming 

Ou toute autre commande vous permettant de soutenir.