socket node example node.js socket.io handshake

node.js - node - Enviar datos personalizados junto con handshakeData en socket.io?



socket.io server (6)

Encontré un pequeño problema para ver el usuario .logged

io.sockets.on(''connection'', function (socket) { var endp = socket.manager.handshaken[socket.id].address; console.log("query... " + socket.manager.handshaken[socket.id].query.loggeduser); // ↑ here }

Así que tengo una aplicación que ejecuta el nodo js con socket.io como back-end y javascript normal como frontend. Mi aplicación tiene un sistema de inicio de sesión que actualmente simplemente hace que el cliente envíe sus datos de inicio de sesión tan pronto como se conecte.

Ahora pensé que sería mucho mejor enviar los datos de inicio de sesión junto con handshakeData, de modo que puedo conectar directamente al usuario mientras me conecto (en lugar de establecer una conexión), respectivamente, rechazar la autorización cuando los datos de inicio de sesión no son válidos.

Estoy pensando que sería mejor poner mis datos adicionales en la parte del encabezado de handshakeData, así que ¿alguna idea de cómo podría hacer eso? (Sin tener que modificar socket.io si es posible, pero si es la única forma en que puedo vivir con él)


Este es mi código para enviar datos de consulta al cliente del servidor nodejs y server.io.

var socket = io.connect(window.location.origin, { query: ''loggeduser=user1'' }); io.sockets.on(''connection'', function (socket) { var endp = socket.manager.handshaken[socket.id].address; console.log("query... " + socket.manager.handshaken[socket.id].query.user); }


Esto ahora ha sido cambiado en v1.0.0. Ver los documentos de migración

básicamente,

io.set(''authorization'', function (handshakeData, callback) { // make sure the handshake data looks good callback(null, true); // error first, ''authorized'' boolean second });

se convierte en:

io.use(function(socket, next) { var handshakeData = socket.request; // make sure the handshake data looks good as before // if error do this: // next(new Error(''not authorized''); // else just call next next(); });


Para socket.io v1.2.1 use esto:

io.use(function (socket, next) { var handshake = socket.handshake; console.log(handshake.query); next(); });


Tal vez la API ha cambiado, pero hice lo siguiente para obtener información adicional para el servidor.

// client io.connect(''localhost:8080'', { query: ''foo=bar'', extra: ''extra''}); // server io.use(function(sock, next) { var handshakeData = sock.request; console.log(''_query:'', handshakeData._query); console.log(''extra:'', handshakeData.extra); next(); });

huellas dactilares

_query: { foo: ''bar'', EIO: ''3'', transport: ''polling'', t: ''1424932455409-0'' } extra: undefined

Si alguien sabe cómo obtener datos de un cliente en el servidor mediante el protocolo de enlace que no está en los parámetros de consulta, hágamelo saber, por favor.

Actualización Me topé con problemas más adelante con esta sintaxis

io.connect(''localhost:8080?foo=bar'');

es lo que estoy usando actualmente.


Como muchos comentarios han señalado a continuación, la API Socket.IO cambió en su versión 1.0 . La autenticación debe hacerse ahora a través de una función de middleware, ver ''Diferencias de autenticación'' @ http://socket.io/docs/migrating-from-0-9/#authentication-differences . Incluiré mi respuesta original para cualquier persona atascada en <1.0 ya que los documentos antiguos parecen haberse ido.

1.0 y más tarde:

Lado del cliente:

//The query member of the options object is passed to the server on connection and parsed as a CGI style Querystring. var socket = io("http://127.0.0.1:3000/", { query: "foo=bar" });

Lado del servidor:

io.use(function(socket, next){ console.log("Query: ", socket.handshake.query); // return the result of next() to accept the connection. if (socket.handshake.query.foo == "bar") { return next(); } // call next() with an Error if you need to reject the connection. next(new Error(''Authentication error'')); });

Pre 1.0

Puede pasar una consulta: param en el segundo argumento para connect () en el lado del cliente que estará disponible en el servidor en el método de autorización.

Lo acabo de probar. En el cliente tengo:

var c = io.connect(''http://127.0.0.1:3000/'', { query: "foo=bar" });

En el servidor:

io.set(''authorization'', function (handshakeData, cb) { console.log(''Auth: '', handshakeData.query); cb(null, true); });

La salida en el servidor se veía así:

:!node node_app/main.js info - socket.io started Auth: { foo: ''bar'', t: ''1355859917678'' }