Учетные данные CORS cookie из мобильного WebView, загруженные локально с файлом: //

Потерпите меня, это требует небольшого объяснения.

Я помогаю создавать гибридный мобильный телефон веб-приложение. Основная кодовая база - это HTML5 и JavaScript, которые будут заключены в собственное мобильное веб-представление (а-ля Phonegap).

Часть функциональности требует, чтобы приложение отправляло информацию в веб-службу, управляемую одним из наших клиентов. . Существует очень мало возможностей для изменения этой веб-службы, поскольку она используется другими. Мы отправляем JSON с помощью HTTP POST и получаем ответы от сервера. Частью этого ответа является файл cookie JSESSIONID, который управляет нашим сеансом с сервером. После при первоначальном вызове initSession () нам необходимо отправлять cookie JSESSIONID с каждым (AJAX) запросом.

При развертывании на мобильном устройстве веб-приложение обертывается во встроенном веб-представлении, которое запускает веб-приложение, просматривая файл: ///path/to/app/index.html .

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

$.ajax({
  url: 'http://thirdparty.com/ws',
  data: data,
  type: "POST",
  dataType: "JSON",
  success: successCallback,
  error: failedCallback
});

Наблюдая за запросами, было очевидно, что файлы cookie не были включены. При ближайшем рассмотрении в спецификации CORS есть специальный раздел для работы с учетными данными пользователя , который включает файлы cookie сеанса. Поэтому я изменил вызов AJAX, включив в него следующее:

$.ajax({
  url: 'http://thirdparty.com/ws',
  data: data,
  type: "POST",
  dataType: "JSON",
  success: successCallback,
  error: failedCallback,
  xhrFields { withCredentials: true }
});

Еще одна ошибка, на этот раз из браузера. Дополнительное чтение дало следующее:

Если сторонний сервер не ответил заголовком Access-Control-Allow-Credentials: true , ответ будет проигнорирован и не станет доступным для веб-содержимого.

Важное примечание: при ответе на запрос с учетными данными сервер должен указать домен в заголовке Access-Control-Allow-Origin и не может использовать подстановочные знаки.

Итак, нам нужно изменить заголовки сервера, чтобы включить Access-Control-Allow-Credentials: true и Access-Control-Allow-Origin в наш источник.

Здесь мы наконец подходим к моей проблеме: при загрузке веб-страницы с использованием протокола file: // заголовок запроса Origin , отправленный из веб-представления, устанавливается на null . Следовательно, он не может быть проанализирован сервером, и поэтому сервер не может установить его в Access-Control-Allow-Origin .Но если сервер не может установить для Access-Control-Allow-Origin значение, отличное от * , мы не сможем отправить учетные данные, включая файлы cookie.

Итак, я застрял. Что делать? Я видел похожий вопрос, размещенный здесь , но я не совсем понимаю предложенный ответ. Любая помощь приветствуется!

30
задан Community 23 May 2017 в 11:47
поделиться