web-dev-qa-db-fra.com

comment définir les origines socket.io pour limiter 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 avons trouvé ceci dans la documentation:

origins est configuré par défaut sur *:* Origines autorisées à se connecter au serveur Socket.IO.

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

13
Michael Moeller

Si vous creusez dans le code source de 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 Origin (ou le référant) provenant du client, récupère le nom de domaine et le port, Et se compare à l'option origins que vous avez spécifiée.

Donc, les valeurs 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 un espace)
  • testsite.com:*/somepath (socket.io ignorera/un chemin)
  • *:*

Et ceux-ci ne sont pas valides (car pas de numéro de port):

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

Notez également que si vous spécifiez sub.testsite.com en tant que valeur origins, le testsite.com sera valide Origin.

34
Oleg

J'ai eu le même problème. Essayez d’exécuter le noeud 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 est en mode développement et ne peut donc pas fonctionner. Après avoir activé le mode de production, tout va bien.

Je sais que la réponse est un peu tardive, mais peut-être que quelqu'un d'autre l'utilisera

9
Rob

Pour les versions plus récentes de socket.io (jusqu'au 2.2.0 actuel, vous devez définir CORS Origin dans les options du serveur.

Voici un bloc de configuration très simple/basique pour ceux qui cherchent sans utiliser express ou autre chose que le moteur socket.io brut;

// Options for socket.io > 1.0.0
var options = {
        allowUpgrades: true,
        transports: [ 'polling', 'websocket' ],
        pingTimeout: 9000,
        pingInterval: 3000,
        cookie: 'mycookie',
        httpCompression: true,
        origins: '*:*' <---- Allow any Origin here
};

io = require('socket.io')(8010, options);

Si vous souhaitez restreindre l'origine, vous devez utiliser origins: 'Host-name:port-num' selon vos besoins. 

0
user3788685