междоменный источник событий

#node.js #cross-domain #cors

#node.js #междоменный #cors

Вопрос:

Я пытаюсь создать сервер EventSource с использованием nodejs, который будет обрабатывать междоменные запросы сервера. Я отправляю обратно заголовок Access-Control-Allow-Origin, но браузер (ни Chrome, ни Opera) не позволяет мне подключиться. Вот заголовки, которые я отправляю обратно:

 this._response.writeHead(200, {
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Credentials': 'true'
});
  

Как я могу сделать это правильно?

С уважением

Комментарии:

1. Opera не поддерживает CORS .

2. Возможно, но Chrome поддерживает CORS, и я все еще получаю исключение безопасности (SECURITY_ERR: исключение DOM 18). Я полагаю, что должен быть взлом, например, Acces-Control-Allow-Origin для XHR, но я просто не смог его найти.

3. Хотя w3.org/TR/cors есть раздел, в котором показано, как его можно использовать с SSE, похоже, что браузеры пока проигнорировали его, и на данный момент нет поддержки CORS SSE.

4. Хотелось бы получить подтверждение этого ^, у меня возникли трудности с настройкой заголовков в EventSource XHR.

Ответ №1:

Allow-Credentials не может использоваться с Allow-Origin установленным значением * . Подумайте о том, чтобы написать полученный исходный заголовок в вашем ответе.

Ответ №2:

смотрите https://github.com/Yaffle/EventSource — polyfill может быть использован для поддержки CORS для Firefox, Webkit и IE 8

Ответ №3:

Попробуйте следующий блок вместо вашего. Браузер вызовет один раз с OPTIONS , а затем запрос будет выполнен, как и ожидалось, после этого.

Вам не понадобится if инструкция, если вы разбили методы запроса, но я хотел предоставить вам полный блок на случай, если вы размещаете его, как в примере с Hello World.

 if (req.method === "OPTIONS") {
    console.log('!OPTIONS');
    var headers = {};
    // IE8 does not allow domains to be specified, just the *
    // headers["Access-Control-Allow-Origin"] = req.headers.origin;
    headers["Access-Control-Allow-Origin"] = "*";
    headers["Access-Control-Allow-Methods"] = "POST, GET, PUT, DELETE, OPTIONS";
    headers["Access-Control-Allow-Credentials"] = false;
    headers["Access-Control-Max-Age"] = '86400'; // 24 hours
    headers["Access-Control-Allow-Headers"] = "X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept";
    res.writeHead(200, headers);
    res.end();
}
  

Ответ №4:

Вы получаете Security Exception (SECURITY_ERR: DOM Exception 18) , если используете междоменные ресурсы. Это может быть связано с :

  1. попытка доступа к локальным ресурсам через file:// (локальные файлы не обслуживаются через сервер узла) или
  2. попытка получить доступ к ресурсам с другого сервера, который не разрешает CORS или
  3. возможно, вы тестируете страницу из локального файла, а не по URL, отправленному с вашего сервера узла.

Ответ №5:

Примечание: При ответе на запрос credentialized requests сервер должен указать источник в значении Access-Control-Allow-Origin заголовка вместо указания подстановочного знака « * «.

https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests

Итак:

 res.setHeader('Access-Control-Allow-Origin', req.headers.origin)
res.setHeader('Access-Control-Allow-Credentials', 'true')
  

(на стороне сервера)

если клиентский origin ( req.headers.origin ) является доверенным.


Или просто установите {withCredentials: false} (на стороне клиента) и используйте res.setHeader('Access-Control-Allow-Origin', '*') , если вам это не нужно.