web-dev-qa-db-fra.com

Activer Access-Control-Allow-Origin pour plusieurs domaines dans nodejs

J'essaie d'autoriser CORS dans node.js mais le problème est que je ne peux pas définir * Sur Access-Control-Allow-Origin Si Access-Control-Allow-Credentials Est défini.

De plus, la spécification indiquait que je ne pouvais pas créer de tableau ou de valeurs séparées par des virgules pour Access-Control-Allow-Origin Et que la méthode suggérée consisterait à faire quelque chose de similaire à ceci Domaines d'origine multiples multiples Access-Control-Allow-Origin??

Mais je n'arrive pas à faire de cette façon dans node.js

["http://mydomain.com:9001", "http://mydomain.com:5001"].map(function(domain) {
  res.setHeader( "Access-Control-Allow-Origin", domain );
});
res.header( "Access-Control-Allow-Credentials", true );

Le problème ici est qu'il est remplacé par la dernière valeur du tableau, l'en-tête sera donc défini sur res.setHeader( "Access-Control-Allow-Origin", "http://mydomain.com:5001" );.

Erreur du navigateur client:

XMLHttpRequest ne peut pas charger http://mydomain.com:9090/api/sync . L'en-tête 'Access-Control-Allow-Origin' a une valeur ' http://mydomain.com:5001 ' qui n'est pas égale à l'origine fournie. Origin ' http://mydomain.com:9001 ' n'est donc pas autorisé à accéder.

58
Ali

Voici ce que j'utilise dans mon application express pour permettre plusieurs origines

app.use(function(req, res, next) {
  var allowedOrigins = ['http://127.0.0.1:8020', 'http://localhost:8020', 'http://127.0.0.1:9000', 'http://localhost:9000'];
  var Origin = req.headers.Origin;
  if(allowedOrigins.indexOf(Origin) > -1){
       res.setHeader('Access-Control-Allow-Origin', Origin);
  }
  //res.header('Access-Control-Allow-Origin', 'http://127.0.0.1:8020');
  res.header('Access-Control-Allow-Methods', 'GET, OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  res.header('Access-Control-Allow-Credentials', true);
  return next();
});
149
Chandru

Pas sûr que ce soit trop tard, mais je l'ai résolu en réglant: res.setHeader("Access-Control-Allow-Origin", req.headers.Origin);

Cela autorisera simplement chaque connexion en tant qu'en-têtes. L'original sera envoyé avec chaque requête.

Vous voudrez peut-être écrire une fonction pour vérifier si req.headers.Origin est un domaine figurant sur la liste blanche (à partir d'un tableau codé en dur) et simplement renvoyer ce domaine s'il existe dans le tableau.

10
Matt

Vérifiez votre liste blanche contre ce que votre req.headers.Origin, par exemple.

var origins = ['a.com', 'b.com', 'c.com', 'boobies.com'];
for(var i=0;i<origins.length;i++){
    var Origin = origins[i];
    if(req.headers.Origin.indexOf(Origin) > -1){ 
         res.setHeader('Access-Control-Allow-Origin', req.headers.Origin);
         return;
    }
    // else, tough cookies. 
}

Prendre plaisir.

6
Ross The Boss

Voici une fonction de middleware simple pour servir l'en-tête CORS correct d'une liste blanche. Si vous le positionnez en haut de votre application express, tous vos itinéraires pourront définir le bon en-tête à partir de la liste blanche avant de diffuser du contenu.

app.use(function(req, res, next){
  var whitelist = ['localhost:4000', 'localhost:3000', 'anydomain.com']
  var Host = req.get('Host');

  whitelist.forEach(function(val, key){
    if (Host.indexOf(val) > -1){
      res.setHeader('Access-Control-Allow-Origin', Host);
    }
  })

  next();
});
6
Alan L.