SFSafariViewController Удалить файл cookie OAuth2

У меня есть приложение iOS, которое аутентифицируется с помощью Uber API, используя OAuth2 в файле UIWebView. При обновлении до iOS 9 я столкнулся с проблемой блокировки ATS запроса https для страницы входа. Затем я добавил исключение для страницы входа в Uber, но затем заметил, что страница входа делает несколько других запросов к Facebook, Amazon Web Services и другим веб-сайтам, и все они блокируются ATS.

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

Я могу завершить процесс OAuth2 с помощью SFSafariViewController, проблема в том, что после завершения аутентификации Uber сохраняет какой-то тип файла cookie. Если я хочу аутентифицировать другую учетную запись и снова вывожу SFSafariViewController, файл cookie берется из предыдущей аутентификации, и нет возможности аутентифицировать другую учетную запись. Я обошел это с помощью UIWebView, удалив файл cookie через NSHTTPCookieStorage, но я не вижу способа удалить файл cookie из SFSafariViewController.


person duncanc4    schedule 22.09.2015    source источник
comment
Вам удалось это решить? Я испытываю ту же проблему.   -  person goldengil    schedule 30.11.2015
comment
Я не нашел решения для удаления файла cookie. Я в основном изменил свое приложение, чтобы отозвать токен OAuth при выходе из системы, поэтому сохраненный файл cookie OAuth больше не действителен.   -  person duncanc4    schedule 30.11.2015


Ответы (2)


Для iOS 9 и более поздних версий лучше всего использовать WKWebView, доступный в Среда WebKit

который предоставляет WKWebsiteDataStore, который можно использовать для удаления файлов cookie/кешей, используемых веб-представлением, см., например: https://stackoverflow.com/a/31803708/313113 или https://stackoverflow.com/a/32491271/313113

Согласно документам: SFSafariViewController передает файлы cookie и другие данные веб-сайта в Safari, и, поскольку он работает вне процесса вашего приложения (по соображениям безопасности), вы не можете изменять его состояние из своего приложения. Посмотрите этот ответ: https://stackoverflow.com/a/34136074/313113 от человека, который связался со службой поддержки Apple и получил следующий ответ:

SFSafariViewController работает вне процесса моего приложения, и в целях безопасности мое приложение не может изменять состояние SFSafariViewController. Другими словами, мое приложение не может очистить учетные данные, хранящиеся в SFSafariViewController.

person Alex Bitek    schedule 29.02.2016
comment
WKWebView не будет работать, потому что тогда мне нужно будет указать домен для каждого HTTP-запроса, сделанного страницей входа в Uber. Учитывая, что страница не поддерживается мной и, скорее всего, изменится, использование исключений ATS легко сломается. Вот почему мне пришлось переключиться на SFSafariViewController. - person duncanc4; 29.02.2016
comment
Вы нашли решение для этого? @duncanc4 - person Mohammad Zaid Pathan; 23.04.2018
comment
Я хотел использовать SFAuthenticationSession, но не мог удалить файлы cookie, поэтому в итоге я использовал WKWebView и сам обрабатывал вещи... - person heyfrank; 23.04.2018
comment
facebook sdk использует SFAuthenticationSession для входа в систему. Поэтому необходимо срочно удалить куки/кеш m.facebook.com. - person DawnSong; 01.10.2019

Итак, я столкнулся с этой же проблемой и увидел ваш вопрос, когда искал, как это решить. В моем случае лучшее решение, которое я придумал, заключалось в том, чтобы выполнить выход из приложения в приложении, а затем представить SFSafariViewController, указывающий на наш URL-адрес выхода. Затем я использовал это, чтобы закрыть SFSafariViewController, как только он был загружен:

extension AlertsTableViewController: SFSafariViewControllerDelegate {

    public func safariViewController(_ controller: SFSafariViewController, didCompleteInitialLoad didLoadSuccessfully: Bool) {
        if controller == logoutSVC {
            controller.dismiss(animated: false)
        }
    }

}

Я сохранил SFSafariViewController в logoutSVC, поэтому я запускаю этот код только в том случае, если это выход из SFSafariViewController. В вашем случае это звучит так, как будто вы только что сделали вызов API для отзыва токена OAuth, что немного приятнее, поскольку он вообще не отображается пользователю, но это хорошо для случаев, когда у вас нет такого доступа. Еще одна вещь, по какой-то причине мне пришлось вызвать метод отклонения (animated: false) в SFSafariViewController вместо фактического текущего UIViewController по какой-то причине. Мне потребовалась секунда, чтобы понять, почему это не работает для меня.

person Brian F Leighty    schedule 20.10.2016