Предположим, что я управляю двумя доменами, www.api_domain.com
и www.website_domain.com
. www.api_domain.com
предлагает API, который требует от пользователя аутентификации, а затем использует куки-файл сеанса для распознавания пользователя, делающего запросы. www.website_domain.com
загружает скрипт на свои страницы с www.api_domain.com
, и этот скрипт хочет совершать вызовы по URL-адресам API на www.api_domain.com
с файлом cookie текущего пользователя и использовать результаты каким-то образом на странице с www.website_domain.com
.Периферийные файлы cookie в IE 8 и 9 без iframe?
Для первоначальной загрузке сценария, или для каких-либо API URL-адресов, которые не требуют пользователя куки сессии, чтобы работать, самым простым решением является просто использовать заголовок
Access-Control-Allow-Origin: http://www.website_domain.com
на ответ от www.api_domain.com
. Похоже, что это работает извне во всех браузерах, кроме IE, и хотя IE не будет уважать заголовок Allow-Origin на AJAX-запросах, созданных с использованием jQuery-AJAX-методов, есть библиотеки типа xdr.js, которые делают некоторые магии за кулисами make jQuery, IE и заголовок Allow-Origin играют хорошо вместе и ведут себя как во всех других браузерах (я не знаю подробностей о том, что делает xdr.js, но он отлично работает для не-учетных запросов, насколько я могу видеть).
Проблема возникает, когда я хочу нажать URL-адрес на http://www.api_domain.com
, для которого требуется файл cookie сеанса пользователя. Когда эта проблема обсуждается в настройки браузера агностиком, как правило, предлагаются два решения:
- Использование
Access-Control-Allow-Credentials: true
на ответ от сделать печенье быть отправлены даже с кросс-доменных запросов. - Создать IFRAME на странице на
http://www.website_domain.com
с началомhttp://www.api_domain.com
, имеют два окна общаться с друг друга, используя HTML5 post messages и делегировать все ответственность за принятие запросов наhttp://www.api_domain.com
к IFrame.
Я очень предпочитаю использовать вариант 1, если это возможно, так как он позволяет писать код Javascript, чтобы использовать API на http://www.api_domain.com
таким же образом, как вы пишете его трогать тот же домен API. Чтобы использовать подход iframe, нам нужно изучить или создать некоторую инфраструктуру для отправки AJAX-подобных запросов в iframe с успехами и обработчиками ошибок. Это также означает, что нам нужно создать код для загрузки в iframe, который будет всего лишь целым куском тонких оберток для попадания URL-адресов API. Это кажется более уродливым, сложнее и труднее понять, чем первый подход.
Однако я не могу понять, как сделать вариант 1 работой над IE. Я устанавливаю Access-Control-Allow-Credentials: true
по моим URL-адресам API, а все другие браузеры отправляют файлы cookie на эти URL-адреса, но IE 9 не работает даже с библиотекой xdr.js. (Я не тестировал IE 8). Никаких других симптомов не сообщать. Я могу видеть заголовки Access-Control-Allow-Origin
и Access-Control-Allow-Credentials
в ответах от www.api_domain.com
, когда я просматриваю их в инструментах разработчика IE, но в запросе нет заголовков файлов cookie.
Есть ли какие-то хаки или магические заклинания, которые я могу использовать, чтобы обозреватель Internet Explorer уважал заголовок Access-Control-Allow-Credentials
, или какой-нибудь другой заголовок, который я могу использовать, который распознает IE?
Помогает ли настройка политики конфиденциальности p3p? http://stackoverflow.com/questions/2666376/copying-cookies-cross-domain-why-is-ie-blocking-cookies-other-browsers-are-send?rq=1 – flup
@flup Нет, это совершенно не имеет отношения к это. –
В стороне, которая не помогает ответить на этот вопрос, но, вероятно, будет полезной для всех, кто ее читает: вместо того, чтобы создавать собственный прокси-сервер iframe, учитывая использование этой библиотеки (https://github.com/jpillora/xdomain/) , Я не тестировал его, но похоже, что он должен прозрачно выполнять всю работу по проксированию междоменного трафика AJAX через почтовое сообщение для вас. Если вы не нуждаетесь в поддержке supercookie для обработки растущего числа браузеров, которые по умолчанию блокируют «сторонние» файлы cookie (в том числе установленные в iframe), он должен быть адекватным. –