wake-up-neo.net

Benutzerdefinierte Daten zusammen mit HandshakeData in socket.io senden?

Ich habe also eine Anwendung, die den Knoten js mit socket.io als Backend und normales Javascript als Frontend ausführt. Meine Anwendung verfügt über ein Anmeldesystem, bei dem der Client seine Anmeldedaten derzeit einfach sendet, sobald er verbunden ist.

Jetzt dachte ich, es wäre viel schöner, wenn die Anmeldedaten zusammen mit den HandshakeData gesendet werden, sodass ich den Benutzer direkt beim Verbinden anmelden kann (anstatt nach dem Herstellen einer Verbindung) bzw. die Autorisierung ablehnen, wenn die Anmeldedaten ungültig sind.

Ich denke, es wäre das Beste, meine zusätzlichen Daten in den Header-Teil der HandshakeData zu packen, also irgendwelche Ideen, wie ich das tun könnte? (Ohne, wenn möglich, socket.io ändern zu müssen, aber wenn es die einzige Möglichkeit ist, damit ich leben kann)

53
Wingblade

Wie viele Kommentare hervorgehoben haben, wurde die Socket.IO-API in ihrer 1.0-Version geändert. Die Authentifizierung sollte jetzt über eine Middleware-Funktion erfolgen, siehe 'Authentifizierungsunterschiede' @ http://socket.io/docs/migrating-from-0-9/#authentication-differences . Ich füge meine ursprüngliche Antwort für jeden hinzu, der auf <1.0 steckt, da die alten Dokumente verschwunden zu sein scheinen.

1.0 und später:

Kundenseite:

//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" });

Serverseite:

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

Vor 1.0

Sie können im zweiten Argument eine Abfrage: param übergeben, um connect () auf der Clientseite zu verwenden, die auf dem Server in der Autorisierungsmethode verfügbar sein wird. 

Ich habe es gerade getestet. Auf dem Kunden habe ich:

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

Auf dem Server:

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

Die Ausgabe auf dem Server sah dann so aus:

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

Dies wurde nun in v1.0.0 geändert. Siehe die Migrationsdokumente .

grundsätzlich gilt,

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

wird :

  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();
});
19
slupek2013

Verwenden Sie für socket.io v1.2.1 Folgendes:

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

Dies ist mein Code zum Senden von Abfragedaten an nodejs und server.io Server Client.

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);
}
7
user2969994

Vielleicht hat sich die API geändert, aber ich habe Folgendes getan, um zusätzliche Informationen an den Server zu bekommen.

// 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();
});

druckt

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

Wenn jemand weiß, wie man Daten vom Client zum Server durch den Handshake erhält das ist nicht in den Abfrageparametern lass es mich wissen.

Update Ich bin später mit dieser Syntax auf Probleme gestoßen

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

ist was ich gerade benutze.

1
Harry Moreno

Ich habe ein kleines Problem gefunden, um den .loggeduser zu sehen.

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
}
0
user3678015

Alter Thread, vorausgesetzt, Sie speichern Ihre jwt-Token-/Sitzungs-ID in Sitzungscookies (Standardmaterial). Dies wird ohnehin standardmäßig an den Server übergeben, wenn Sie Handshake (socket.io-client) ausführen Holen Sie sich einfach die Auth-Informationen für den Handshake (über Middleware oder on.connection) über Cookie? z.

io.on('connection', function(socket) {
  // assuming base64url token
  const cookieStr = socket.handshake.headers.cookie
  const matchRes =
    cookieStr == null
      ? false
      : cookieStr.match(/my-auth-token=([a-zA-Z0-9_.-]+)/)
  if (matchRes) {
    // verify your jwt...
    if ( tokenIsGood(matchRes[1]) {
      // handle authenticated new socket
    } else {
      socket.emit('AUTH_ERR_LOGOUT')
      socket.disconnect()
    }
  } else {
    socket.emit('AUTH_ERR_LOGOUT')
    socket.disconnect()
  }
}

Ich benutze das jetzt für ein Projekt und es funktioniert gut.

0
KM3