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.
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();
});
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.
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.
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();
});