Socket.io + Node.js Demande d’origine croisée bloquée

J’utilise node et socket.io pour écrire une application de discussion. Cela fonctionne bien sous Chrome, mais mozilla génère une erreur pour activer les requêtes d’origine croisée.

Demande d’origine croisée bloquée: la règle d’origine identique interdit la lecture de la ressource distante à l’ adresse http://waleedahmad.kd.io:3000/socket.io/?EIO=2&transport=polling&t=1401964309289-2&sid=1OyDavRDf4WErI-VAAAI . Cela peut être corrigé en déplaçant la ressource dans le même domaine ou en activant CORS.

Voici mon code pour démarrer le serveur de noeud.

var express = require('express'), app = express(), server = require('http').createServer(app), io = require('socket.io').listen(server), path = require('path'); server.listen(3000); app.get('/', function(req, res) { res.sendfile(__dirname + '/public/index.html'); }); 

Du côté du client.

 var socket = io.connect('//waleedahmad.kd.io:3000/'); 

Balise de script sur la page HTML.

  

J’utilise également le fichier .htaccess dans le répertoire racine de l’application. (waleedahmad.kd.io/node).

 Header add Access-Control-Allow-Origin "*" Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type" Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS" 

    Solution simple côté serveur

     var io = require('socket.io')(server, { origins: '*:*'}); 

    ou

     io.set('origins', '*:*'); 

    ou

     io.origins('*:*') // for latest version 

    * seul ne fonctionne pas, ce qui m’a fait descendre dans des trous de lapin.

    Vous pouvez essayer de définir l’option d’ origins côté serveur pour autoriser les requêtes d’origine croisée:

     io.set('origins', 'http://yourdomain.com:80'); 

    Ici http://yourdomain.com:80 est l’origine à partir de laquelle vous souhaitez autoriser les demandes.

    Vous pouvez en savoir plus sur le format d’ origins ici

    Cela pourrait être un problème de certificateion avec Firefox, pas nécessairement quelque chose qui ne va pas avec votre CORS. Requête Firefox CORS donnant la “Requête d’origine croisée bloquée” malgré les en-têtes

    Je rencontrais exactement le même problème avec Socketio et Nodejs en lançant une erreur CORS dans Firefox. J’avais Certs pour * .myNodeSite.com, mais je faisais référence à l’adresse IP du réseau local 192.168.1.10 pour Nodejs. (L’adresse IP WAN peut également générer la même erreur.) Le certificate ne correspondant pas à la référence de l’adresse IP, Firefox a renvoyé cette erreur.

    Après avoir lu beaucoup de sujets sur StakOverflow et d’autres forums, j’ai trouvé la solution la plus adaptée à mes besoins. Cette solution est pour travailler sans Express .

    voici les prérequirejs.

    • appelez votre script js (src =) depuis le même serveur que celui auquel le socket sera connecté (pas d’appel CDN ou local)
    • s’assurer d’avoir la même version de socket.io côté serveur et côté client
    • modules de noeud requirejs: fs , chemin , socket.io et winston pour la journalisation
    • Installez Encrypt certbot et générez un certificate pour votre domaine ou achetez un certificate SSL
    • jQuery déclaré avant socket.io.js côté client
    • Encodage UTF-8

    DU CÔTÉ SERVEUR

     // DEPENDENCIES var fs = require('fs'), winston = require('winston'), path = require('path'); // LOGS const logger = winston.createLogger({ level : 'info', format : winston.format.json(), transports: [ new winston.transports.Console({ level: 'debug' }), new winston.transports.File({ filename: 'err.log', level: 'err' }), new winston.transports.File({ filename: 'combined.log' }) ] }); // CONSTANTS const Port = 9000, certsPath = '/etc/letsencrypt/live/my.domain.com/'; // STARTING HTTPS SERVER var server = require('https').createServer({ key: fs.readFileSync(certsPath + 'privkey.pem'), cert: fs.readFileSync(certsPath + 'cert.pem'), ca: fs.readFileSync(certsPath + 'chain.pem'), requestCert: false, rejectUnauthorized: false }, (req, res) => { var filePath = '.' + req.url; logger.info('FILE ASKED : ' + filePath); // Default page for visitor calling directly URL if (filePath == './') filePath = './index.html'; var extname = path.extname(filePath); var contentType = 'text/html'; switch (extname) { case '.js': contentType = 'text/javascript'; break; case '.css': contentType = 'text/css'; break; case '.json': contentType = 'application/json'; break; case '.png': contentType = 'image/png'; break; case '.jpg': contentType = 'image/jpg'; break; case '.wav': contentType = 'audio/wav'; break; } var headers = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'OPTIONS, POST, GET', 'Access-Control-Max-Age': 2592000, // 30 days 'Content-Type': contentType }; fs.readFile(filePath, function(err, content) { if (err) { if(err.code == 'ENOENT'){ fs.readFile('./errpages/404.html', function(err, content) { res.writeHead(404, headers); res.end(content, 'utf-8'); }); } else { fs.readFile('./errpages/500.html', function(err, content) { res.writeHead(500, headers); res.end(content, 'utf-8'); }); } } else { res.writeHead(200, headers); res.end(content, 'utf-8'); } }); if (req.method === 'OPTIONS') { res.writeHead(204, headers); res.end(); } }).listen(port); //OPENING SOCKET var io = require('socket.io')(server).on('connection', function(s) { logger.info("SERVER > Socket opened from client"); //... your code here }); 

    CÔTÉ CLIENT