Приложение Ioni c на iOS требует отключения настройки Safari «предотвращать межсайтовое отслеживание» - PullRequest
0 голосов
/ 17 января 2020

У нас есть приложение Ioni c 4 (Cordova / Angular), которое отправляет запросы в бэкэнд API REST с помощью HttpClient, используя куки для аутентификации.

Приложение отлично работает на Android (что, очевидно, подтверждает, что мы правильно настроили CORS). Сейчас мы находимся в процессе адаптации к iOS. Мы обнаружили, что когда параметр Safari «предотвращать межсайтовое отслеживание» включен (что по умолчанию), WkWebView игнорирует заголовок Set-Cook ie, который отправляется бэкэндом в ответ на успешный запрос входа в систему, вызывая сбой всех последующих запросов.

Есть ли способ избежать этой проблемы, не требуя от всех пользователей отключения этой настройки (что, безусловно, не вариант)? Мы рассмотрели переход на аутентификацию JWT, но боюсь, что это не решит проблему, так как наш сервер ожидает JSON, и, согласно документации, заголовки «Content-Type: application / json» также вызывают запрос должен рассматриваться как запрос CORS.

Кроме того, мы столкнулись с другой проблемой, которая кажется связанной. Приложение не будет работать на симуляторе iOS в macOS - заголовки Set-Cook ie игнорируются, даже если мы отключили вышеуказанную настройку! Это означает, что мы можем отлаживать приложение только на физическом устройстве, что является серьезным препятствием.

После нескольких часов поиска в Интернете и отсутствия подобных жалоб у меня возникает ощущение, что я упускаю что-то очевидное.

1 Ответ

0 голосов
/ 19 января 2020

Эта библиотека пришла мне на помощь: ioni c -native-http-connection-backend

Цитирование из документов:

This библиотека добавляет @ ioni c -native / http (при наличии) в качестве серверной части соединения к Angular Http и HttpClient Motivation

Теперь, когда Apple поощряет / требует использования WKWebView вместо устаревшего UIWebView Ioni c переключил вновь созданные приложения через их cordova-plugin-ioni c -webview (и Cordova предлагает его через свой cordova-plugin-wkwebview-engine). Это приводит к тому, что запросы, которые раньше работали нормально, не работают с ошибками CORS.

Реальное решение, конечно, состоит в том, чтобы исправить проблемы с CORS на стороне сервера - но это может быть невозможно, например, с помощью сторонних API.

Несмотря на то, что существует способ решения проблем CORS без изменения заголовка ответа сервера с помощью @ ioni c -native / http, он работает только на устройстве и не обеспечивает всю мощь Http Angular. и HttpClient. Как это работает

Библиотека предоставляет интерфейс HttpBackend для Angular HttpClient. Этот интерфейс HttpBackend пытается использовать @ ioni c -native / http, когда это возможно (= на устройстве с установленным плагином). Если HttpBackend считает невозможным использование @ ioni c -native / http, он возвращается к стандартному Angular коду (HttpXhrBackend, который использует XmlHttpRequest)

Эта стратегия позволяет разработчикам использовать Angular HttpClient прозрачно в обеих средах: браузер и устройство.

Хотя я все еще нахожу странным, что разработчик упоминает только предполагаемое использование библиотеки в ситуациях, когда CORS не может быть настроен на стороне сервера, но не 2 проблемы, которые он решает для меня, а именно: 1) необходимость требовать от всех пользователей разрешения межсайтового отслеживания и 2) невозможность использования симулятора.

...