Comment configurer les origines socket.io pour restreindre les connexions à une seule URL

Nous avons un site html et un serveur node.js qui dessert ce site. Le site Web et le serveur échangent des données à l'aide de socke.io. Nous l'avons trouvé dans la documentation:

Origines par défaut *:* Les origines qui sont autorisées à se connecter au serveur Socket.IO.

Notre site html est sur http://questionexample.com/page1 . Seul ce site peut se connecter à notre serveur (mais tout le monde peut se connecter à ce site.) Comment devons-nous définir les origines?

Si vous creusez dans le code source Socket.io, vous trouverez ces lignes:

 var origin = request.headers.origin || request.headers.referer , origins = this.get('origins'); ... var parts = url.parse(origin); parts.port = parts.port || 80; var ok = ~origins.indexOf(parts.hostname + ':' + parts.port) || ~origins.indexOf(parts.hostname + ':*') || ~origins.indexOf('*:' + parts.port); 

Comme vous pouvez le voir, Socket.io prend son origine (ou référant) provenant du client, récupère le nom de domaine et le port, et se compare à l'option d' origins vous avez spécifiée.

Donc, les valeurs d' origins valides sont ( * signifie "tout"):

  • testsite.com:80
  • http://testsite.com:80
  • http://*:8080
  • *:8080
  • testsite.com:* http://someotherdomain.com:8080 (plusieurs origines séparées par l'espace)
  • testsite.com:*/somepath (socket.io ignorera / somepath)
  • *:*

Et ce n'est pas valide (car aucun numéro de port):

  • testsite.com
  • http://testsite.com
  • http://testsite.com/somepath

Notez également que si vous spécifiez sub.testsite.com comme valeur d'origine, testsite.com sera une origine valide .

J'ai eu un problème similaire. Essayez d'exécuter le nœud en mode de production NODE_ENV=production node app.js . J'avais ce code ( comme recommandé ici ):

 io.configure('production', function(){ console.log("Server in production mode"); io.enable('browser client minification'); // send minified client io.enable('browser client etag'); // apply etag caching logic based on version number io.enable('browser client gzip'); // the file io.set('log level', 1); // logging io.set('transports', [ // all transports (optional if you want flashsocket) 'websocket' , 'flashsocket' , 'htmlfile' , 'xhr-polling' , 'jsonp-polling' ]); io.set('origins', 'http://questionexample.com/page1:*'); }); 

Et Node rans en mode développement, donc il ne pouvait tout simplement pas fonctionner. Après avoir activé le mode de production, tout va bien.

Je sais que c'est une réponse un peu tardive, mais peut-être que quelqu'un d'autre va l'utiliser

Je pense io.set('origins', http://questionexample.com/page1) devrait le faire