node.js - resource - Habilite Access-Control-Allow-Origin para varios dominios en nodejs
node no access control allow origin header is present on the requested resource origin (4)
Aquí hay una función de middleware simple para servir el encabezado CORS correcto de una lista blanca. Establecer esto cerca de la parte superior de su aplicación express permitirá que todas sus rutas configuren el encabezado adecuado de la lista blanca antes de publicar el contenido.
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();
});
Esta pregunta ya tiene una respuesta aquí:
Estoy intentando permitir CORS en node.js, pero el problema es que no puedo establecer *
en Access-Control-Allow-Origin
si está establecido Access-Control-Allow-Credentials
.
Además, la especificación dice que no puedo hacer una matriz o un valor separado por comas para Access-Control-Allow-Origin
y el método sugerido sería hacer algo similar a los dominios de origen múltiple de Access-Control-Allow-Origin.
Pero parece que no puedo hacerlo de esta manera en 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 );
El problema aquí es que se invalidará con el último valor de la matriz, por lo que el encabezado se establecerá en res.setHeader( "Access-Control-Allow-Origin", "http://mydomain.com:5001" );
Error del navegador del cliente:
XMLHttpRequest no puede cargar http://mydomain.com:9090/api/sync . El encabezado ''Access-Control-Allow-Origin'' tiene un valor '' http://midominio.com:5001 '' que no es igual al origen proporcionado. El origen '' http://midominio.com:9001 '' no está, por lo tanto, permitido.
Compruebe su lista blanca en contra de lo que su req.headers.origin por ejemplo
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.
}
Disfrutar.
Esto es lo que uso en mi aplicación expresa para permitir múltiples orígenes
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();
});
No estoy seguro de si esto es demasiado tarde, pero lo resolví configurando: res.setHeader ("Access-Control-Allow-Origin", req.headers.origin);
Esto simplemente permitirá cada conexión, ya que headers.origin se enviará con cada consulta. Como soy un Node.js total y un novato web en general, agradecería cualquier comentario sobre esta respuesta. Además, esto probablemente frustraría el propósito al restringir qué orígenes aceptar y probablemente sea horrible de usar en la producción.
Es posible que desee escribir una función para verificar si el req.headers.origin es un dominio incluido en la lista blanca (de una matriz codificada) y simplemente devuelva este dominio si existe en la matriz.