web-dev-qa-db-fra.com

Autorisation et prise de contact avec Socket.IO

Je me demande quelle est la fonction principale de l'autorisation et de la poignée de main dans Socket.IO. J'ai déjà lu leur wiki et guide d'autorisation sur GitHub mais je ne comprends toujours pas ce qui suit:

  1. Comment fonctionne l'autorisation dans Socket.io?
  2. Quelle est la poignée de main dans Socket.IO?
  3. Puis-je ajouter quelque chose à l'objet handshakeData?

J'espère que vous pourrez répondre à ma question. Merci.

34
Joenel de Asis

Edit: Dans Socket.IO 1.0, le middleware est maintenant utilisé. L'autorisation peut se faire comme suit:

io.use(function(socket, next) {
  var handshake = socket.request;
  next();
});

Si vous deviez rejeter le socket, passez simplement un objet d'erreur à la fonction de rappel next(). La même chose peut être faite avec les espaces de noms:

io.of('/namespace').use(function(socket, next) {
  var handshake = socket.request;
  next();
});

L'autorisation dans Socket.IO est exécutée via une fonction qui est décidée dans un booléen transmis par un rappel. Cette fonction s'exécute à chaque fois qu'une connexion tente une prise de contact, et voici à quoi elle ressemble:

io.set('authorization', function (handshake, callback) {
  callback(null, true);
});

La fonction callback() accepte deux paramètres. Le premier est la raison de l'erreur, le cas échéant, et le second paramètre est le booléen qui décide si un client peut se connecter ou non. Par défaut, il n'y a pas d'autorisation, donc le scénario est illustré dans l'exemple de code ci-dessus, où le socket qui se connecte est autorisé à passer avec true.

La prise de contact dans Socket.IO est comme toute autre prise de contact liée aux technologies de l'information. C'est le processus de négociation qui, dans le cas de Socket.IO, décide si un client peut se connecter, et sinon, refuse la connexion. La prise de contact est initiée avec une demande XHR ou JSONP, et ne fait pas grand-chose lorsqu'aucune autorisation n'est spécifiée, mais peut être utile dans les données transmises dans l'objet de données handshake.

Pour répondre à votre dernière question, oui, vous pouvez ajouter n'importe quoi dans l'objet handshake. L'objet est la même référence variable à l'objet socket.handshake, Ce qui vous permet de faire des choses comme ceci:

io.set('authorization', function (handshake, callback) {
  handshake.foo = 'bar';
  callback(null, true);
});

io.sockets.on('connection', function(socket) {
  console.log(socket.handshake.foo); // bar
});

Ceci est très utile, car vous pouvez stocker des propriétés basées sur des sockets. Une utilisation courante pour cela est avec le framework Express, où l'on peut identifier l'ID de session sur la base des cookies passés par Socket.IO, qui peut ensuite identifier une session correspondante.

63
hexacyanide

Depuis Socket.io 1.0, bien qu'il existe une compatibilité ascendante, il est recommandé d'utiliser "io.use ()" afin d'ajouter votre middleware ad hoc, donc dans le Node côté serveur:

io.use(function(socket, next){
  var joinServerParameters = JSON.parse(socket.handshake.query.joinServerParameters);
  if (joinServerParameters.token == "xxx" ){
    next();          
  } else {
    //next(new Error('Authentication error'));                  
  }
  return;       
});

Et du côté client, pour ajouter votre propre attribut à la poignée de main, cela ressemblerait à ceci:

var joinServerParameters = { token: "xxx"   };    
var socket = io.connect('url' , {query: 'joinServerParameters=' + JSON.stringify(joinServerParameters)  });
10

En ce moment, j'utilise cette méthode simple:

io.set('authorization', function (handshakeData, accept) {
  var domain = handshakeData.headers.referer.replace('http://','').replace('https://','').split(/[/?#]/)[0];
  if('myDomain.com'==domain)
    accept(null, true);
  else 
    return accept('Deny', false);
});
2
Diogo Garcia

je sais que c'est trop tard mais je voudrais ajouter les informations où j'ai trouvé un très bon article sur l'autorisation de prise de contact en utilisant socket.io.

autorisation socket.io

0
Vora Ankit