Выполнение запроса CORS с использованием Backbone в IE8/9

Я пишу основное приложение, которое будет размещено на app.ourdomain.com/store.

Я хочу получить доступ к данным на api.ourdomain.com/ourApi, используя HTTP-аутентификацию, уже встроенную в наш API.

Теперь, насколько я понимаю, в ответе требуется заголовок CORS, Access-Control-Allow-Origin: *, чтобы разрешить эту поддержку перекрестного происхождения.

Однако это не работает в IE8/9. Я читал на SO и в других местах, что я могу просто добавить $.support.cors = true;, и это волшебным образом начнет работать в IE8/9.

Прежде чем я углублюсь в этот проект, я надеюсь, что кто-то с практическим опытом сможет ответить на этот вопрос:

Если мы напишем наш API для обработки предполетного запроса OPTIONS, разрешив запрос из разных источников, добавим это переопределение в объект $.support, получим ли мы тогда полный доступ ко всем HTTP-глаголам (включая PUT/DELETE), возможность аутентифицировать и включать пользовательские заголовки в IE8/9 (как мы делаем во всех современных браузерах, использующих XMLHttpRequest)?

Эта статья описывает ограничения/ограничения объекта XDomainRequest, который IE8/9 использует для таких запросов. Меня особенно интересуют № 3 и № 5, в которых говорится:

#3: No custom headers may be added to the request

Мы используем настраиваемый заголовок для указания идентификатора клиента, отправляющего запрос.

#5: No authentication or cookies will be sent with the request

Мы используем HTTP-аутентификацию для аутентификации пользователя при первоначальном запросе, а при последующих запросах используем access_token, возвращенный во время исходного запроса.

Поскольку поддержка IE8/9 является обязательной прямо сейчас, означает ли это, что я не могу использовать Backbone для запроса данных в другой поддомен в нашей системе, не делая при этом глупых действий, например, создавая прокси-API в поддомене A для доступа к данным в поддомене B?

Ваше здоровье.


person Scott Silvi    schedule 18.01.2013    source источник


Ответы (2)


Ваша оценка звучит правильно. К сожалению, нет обходного пути для пользовательских заголовков, дополнительных методов или файлов cookie при использовании CORS в IE8/9 (IE10 должен иметь их полную поддержку).

Прокси-сервер — один из вариантов. Другой вариант — разместить HTML-страницу в удаленном домене, включить эту HTML-страницу в iframe на вызывающей странице, а затем использовать window.postMessage для обмена данными между iframe и вызывающей страницей. Поскольку iframe-страница находится в том же домене, что и API, она может сделать запрос того же источника с помощью XHR, а затем передать данные на вызывающую страницу с помощью window.postMessage.

Этот механизм «прокси-сервера iframe» по-прежнему требует некоторого взлома субдомена B, особенно для размещения страницы iframe. Однако это все же может быть лучше, чем полноценный прокси-сервер, поскольку это чистое решение на основе HTML/JavaScript. Обратите внимание, что IE8/9 по-прежнему имеет некоторые ограничения для postMessage (хотя они, похоже, не влияют на iframe). . Вы можете найти описание этого механизма «iframe proxy» здесь:

person monsur    schedule 18.01.2013
comment
Блех. Удовлетворяя Forture 500, у нас есть МНОГО пользователей, которые сидят за IE8/IE9 (~ 45%). Другим решением было бы настроить виртуальный каталог в поддомене нашего приложения, который указывает на ту же кодовую базу, в которой находится наш поддомен API, и, вероятно, именно туда мы и пойдем ... просто не хотите настраивать эти виртуальные каталоги. на каждом поддомене, который хочет использовать наш API для внутренних целей. - person Scott Silvi; 19.01.2013

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

Таким образом, я столкнулся именно с этой проблемой и написал библиотеку, которая служит заменой синхронизации Backbone, которая включает CORS в IE7/8/9 с использованием объекта XDomainRequest.

https://github.com/victorquinn/Backbone.CrossDomain

При этом вы сможете включить его сразу после Backbone.js, выполнять междоменные запросы, и эти запросы из IE должны просто работать без необходимости изменять остальную часть вашего кода.

person Victor Quinn    schedule 16.05.2013