Подтвердить что ты не робот

Включить Access-Control-Allow-Origin для нескольких доменов в nodejs

Я пытаюсь разрешить CORS в node.js, но проблема в том, что я не могу установить * в Access-Control-Allow-Origin, если установлен Access-Control-Allow-Credentials.

Кроме того, спецификация говорит, что я не могу выполнить выделение массива или запятой для Access-Control-Allow-Origin, и предлагаемый метод должен был бы сделать что-то похожее на это Access-Control-Allow- Происхождение нескольких доменов происхождения?

Но я не могу этого сделать в 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 );

Проблема заключается в том, что она переопределяется последним значением в массиве, поэтому заголовок будет установлен на res.setHeader( "Access-Control-Allow-Origin", "http://mydomain.com:5001" );

Ошибка в клиентском браузере:

XMLHttpRequest не может загрузить http://mydomain.com:9090/api/sync. Заголовок "Access-Control-Allow-Origin" имеет значение 'http://mydomain.com:5001', который не равен предоставленному происхождению. Origin 'http://mydomain.com:9001', следовательно, не допускается.

4b9b3361

Ответ 1

Вот что я использую в своем экспресс-приложении, чтобы разрешить несколько истоков

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

Ответ 2

Не уверен, что это слишком поздно, но я решил это, установив: res.setHeader("Access-Control-Allow-Origin", req.headers.origin);

Это просто разрешит каждое соединение, так как headers.origin будет отправляться с каждым запросом.

Возможно, вы захотите написать функцию для проверки, является ли req.headers.origin доменом из белого списка (из жестко заданного массива), и просто вернуть этот домен, если он существует в массиве.

Ответ 3

Проверьте свой белый список на то, что ваш req.headers.origin, например.

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. 
}

Enjoy.

Ответ 4

Здесь простая функция промежуточного слоя, чтобы обслуживать правильный заголовок CORS из белого списка. Установка этого в верхней части вашего экспресс-приложения позволит всем вашим маршрутам установить правильный заголовок из белого списка перед тем, как обслуживать контент.

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