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



Answers

Я предполагаю, что если вы создаете гибридное приложение, вы используете кордову. Если это так, вам не нужен CORS, вам просто нужно, чтобы белый список доменов, к которым вы собираетесь получить доступ.

http://docs.phonegap.com/en/3.0.0/guide_appdev_whitelist_index.md.html

Question

Потерпите меня, вам нужно немного объяснений.

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

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

При развертывании на мобильном устройстве веб-приложение завершается в собственном веб-представлении, которое запускает веб-приложение, просматривая file:///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 и не может использовать wild carding.

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

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

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




Попробуйте взглянуть на www.5app.co.uk. Исключает использование вызовов XHR в целом и надежно работает на мобильных устройствах, когда происходит соединение данных. Затем Gateway взаимодействует с вашим клиентом.




Например, на стороне php вам необходимо установить следующее:

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, Accept, Authorization, X-Request-With, Set-Cookie, Cookie, Bearer');
header('Access-Control-Allow-Credentials: true');
// header('Cookie: PHPSESSID='.$_COOKIE['PHPSESSID']);



Links