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'' }