Origine http: // localhost n'est pas autorisé par Access-Control-Allow-Origin

J'essaie de faire une extraction de backbone.js à mon serveur node.js. Cependant, je reçois l'erreur suivante dans la console:

Origin http://localhost is not allowed by Access-Control-Allow-Origin.

J'ai ajouté ce qui suit à mon serveur node.js:

 var allowCrossDomain = function(req, res, next) { res.header('Access-Control-Allow-Origin', "http://localhost"); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); res.header('Access-Control-Allow-Headers', 'Content-Type'); }; app.configure(function() { app.use(allowCrossDomain); }); 

Mais il retourne toujours la même erreur. Cependant, même si cela a fonctionné, cela ne semble pas être la solution idéale, car j'aimerais que les utilisateurs de tous les pays puissent envoyer des demandes.

Si vous souhaitez que tout le monde puisse accéder à l'application Node, essayez d'utiliser

 res.header('Access-Control-Allow-Origin', "*") 

Cela permettra les demandes de toute origine. Le site de validation CORS contient beaucoup d'informations sur les différents en-têtes Access-Control-Allow et sur la façon de les utiliser.

Si vous utilisez Chrome, regardez ce bug concernant localhost et Access-Control-Allow-Origin. Il y a une autre question StackOverflow ici qui détaille le problème.

Si vous effectuez l'appel de récupération à votre localhost, je suppose que node.js est dans le même répertoire que votre code backbone, qu'il sera probablement sur http://localhost:3000 ou quelque chose comme ça. Que ce soit votre modèle:

 var model = Backbone.Model.extend({ url: '/item' }); 

Et dans votre node.js, vous devez maintenant accepter cet appel comme ceci:

 app.get('/item', function(req, res){ res.send('some info here'); }); 

Il y a 2 appels qui doivent définir les en-têtes corrects. Au départ, il y a une vérification de pré-vol, donc vous avez besoin de quelque chose comme …

 app.get('/item', item.list); app.options('/item', item.preflight); 

Et ont ensuite les fonctions suivantes …

 exports.list = function (req, res) { Items.allItems(function (err, items) { ... res.header('Access-Control-Allow-Origin', "*"); // TODO - Make this more secure!! res.header('Access-Control-Allow-Methods', 'GET,PUT,POST'); res.header('Access-Control-Allow-Headers', 'Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept'); res.send(items); } ); }; 

Et pour les contrôles avant vol

 exports.preflight = function (req, res) { Items.allItems(function (err, items) { res.header('Access-Control-Allow-Origin', "*"); // TODO - Make this more secure!! res.header('Access-Control-Allow-Methods', 'GET,PUT,POST'); res.header('Access-Control-Allow-Headers', 'Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept'); res.send(200); } ); }; 

Vous pouvez consolider le code res.header () dans une seule fonction si vous le souhaitez.

Aussi, comme indiqué ci-dessus, faites attention à l'utilisation de res.header ('Access-Control-Allow-Origin', "*"), cela signifie que tout le monde peut accéder à votre site!

Par localhost, vous devez utiliser l'origine null . Je vous recommande de créer une liste d'hôtes autorisés et de vérifier l'en-tête Host la demande. Si elle est contenue dans la liste, puis par localhost, renvoyez une

 res.header('Access-Control-Allow-Origin', "null"); 

Par tout autre domaine et

 res.header('Access-Control-Allow-Origin', hostSentByTheRequestHeader); 

Si elle n'est pas contenue dans la liste, renvoyez le nom d'hôte des serveurs, de sorte que le navigateur cachera la réponse par ces demandes.

Ceci est beaucoup plus sécurisé, car en autorisant l'origine * et autoriser les informations d'identification, tout le monde sera capable de voler des données de profil d'un utilisateur connecté, etc.

Pour résumer quelque chose comme ceci:

 if (reqHost in allowedHosts) if (reqHost == "http://localhost") res.header('Access-Control-Allow-Origin', "null"); else res.header('Access-Control-Allow-Origin', reqHost); else res.header('Access-Control-Allow-Origin', serverHost); 

Est la solution la plus sécurisée si vous souhaitez autoriser plusieurs autres domaines à accéder à votre page. (Je suppose que vous pouvez comprendre comment obtenir l'en-tête de demande d'hôte et l'hôte du serveur par node.js.)