SFAuthenticationSession/ASWebAuthenticationSession и выход из системы
Я планирую переключить приложение со старого потока OAuth с помощью SFSafariViewController
в новый поток с iOS 11 SFAuthenticationSession
, Вход в систему не проблема, переход на новый API занял у меня несколько минут. Однако выход из системы меня озадачил.
Как?
Я не могу найти упоминания о желании предложить возможность выхода из системы где-либо в документации. Используя старый SFSafariViewController
сделать файлы cookie недействительными? Нет, они больше не делятся с SFAuthenticationSession
, Как только я перезапускаю сеанс аутентификации, пользователь автоматически входит в систему, и выхода нет. Так как включить выход? Или я просто упускаю что-то совершенно очевидное?
Обновление: я нашел "способ, который работает" в техническом смысле, но это мешает пользователю: открыть новую SFAuthenticationSession на странице выхода, которая очищает куки. Но это означает, что при выходе из системы представление предупреждений снова спрашивает пользователя, хочет ли он войти через службу. Если выбрано " да" ("вход в систему"), открывается страница выхода из очистки файлов cookie, пользователь должен вручную закрыть представление, которое может быть обработано обработчиком завершения, и мы знаем, что мы можем снова открыть представление входа в систему… отображая Войти, чтобы выйти? Мне действительно не нравится это решение.
Есть идеи? Я все еще пропускаю совершенно очевидное решение?
Обновление 2: пока никто не имеет ни малейшего представления об этой проблеме, это, вероятно, нелегко. Я подал предложение в Apple через инструмент отчетов, чтобы либо уточнить, как с этим справиться, либо встроить его в API, если он недоступен. Выложу, если получу ответ.
Обновление 3: Обдумав проблему немного подробнее, мы нашли другое возможное (хотя и непривлекательное) решение, если вы можете повлиять на страницу входа провайдера OAuth: сделать куки очень недолговечными. Затем страница входа в систему может быть открыта без автоматического входа в систему. Однако это убивает всю цель разделения сеансов входа в систему между приложениями... и вы должны иметь возможность влиять на страницу входа.
Обновление 4: начиная с iOS 12 SFAuthenticationSession
устарела и получила замену ASWebAuthenticationSession
, тем не мение ASWebAuthenticationSession
ничего не меняет в отношении выхода из системы. Это все еще невозможно. Та же проблема, что и раньше.
10 ответов
При использовании ASWebAuthenticationSession установка.prefersEphemeralWebBrowserSession значения true перед вызовом.start() заставит пользователя ввести учетные данные в сеансе браузера. Хотя это не то же самое, что выход из системы, это позволит новому пользователю войти в систему с другими учетными данными при запуске следующего сеанса.
Это обновление (апрель 2020 г.) может быть полезно для всех, кто борется с этим. Я потратил несколько часов на тестирование различных вариантов, просматривая приложения и глядя, как они это делают, а также читал форумы / обсуждения.
- Я не нашел способа программно очистить файлы cookie, и в Apple нет документации по этому поводу.
- На примере FB. Выход из Safari и удаление приложения FB не помогает. Любое загруженное приложение не будет запрашивать вход в FB, если вы входили в систему один раз до этого.
ASWebAuthenticationSession
илиSFAuthenticationSession
. - Если пользователи спрашивают, как принудительно войти в систему (даже если это не ваша проблема как разработчика), вы можете указать им: Настройки -> Safari -> Дополнительно -> Данные веб-сайта -> Удалить все данные веб-сайта (или только те, которые принадлежат поставщику).
- Если ваш вариант использования требует переключения пользователей (например, в моем случае, когда мы используем Azure AD и пользователи используют один телефон), у вас есть 2 варианта. А) Открыть
ASWebAuthenticationSession
с конечной точкой выхода (как уже упоминалось, это очень странный UX). Б) Откройте Safari как отдельное приложение (не внутри вашего) и выполните вход / выход из системы. К сожалению, нет способа перенаправить пользователя в ваше приложение после выхода из системы, если поставщик OAuth не поддерживает перенаправление при выходе из системы.
Это отстой, потому что это мешает разработчикам создавать приятные впечатления на iOS для случаев использования, когда бизнесу необходимо совместно использовать устройство между несколькими пользователями, а OAuth используется в качестве поставщика удостоверений.
Одно из "лучших" решений, с которыми я столкнулся, - это открыть страницу выхода из системы в Safari (не SFSafariViewController
). Так как ASWebAuthenticationSession
надежно делится файлами cookie с Safari, файлы cookie, срок действия которых истек / удален, также влияют на работу приложения.
Смотрите эту страницу GitHub для более подробной информации.
В одном из наших приложений мы уже начали использовать ASWebAuthenticationSession.
Наш вариант использования выходит за рамки простого получения токенов доступа и обновления при входе в систему. Я имею в виду, что один и тот же файл cookie сеанса используется при открытии веб-приложения (при входе в приложение iOS), чтобы уберечь пользователя от повторной аутентификации снова и снова. В конце концов, приходит время, когда пользователь, наконец, решает выйти из своей учетной записи и может после этого попытаться снова войти в систему, используя другую учетную запись. Поскольку файл cookie сеанса пользователя к тому времени может быть все еще активен, любая попытка повторного входа в систему только на мгновение высвечивает экран аутентификации, автоматически возвращая пользователя в свою первую учетную запись, не давая ему возможности ввести учетные данные второй учетной записи.
Чтобы действительно заставить пользователя вводить свои учетные данные каждый раз, когда мы показываем экран аутентификации, мы должны добавить к нашим параметрам запроса Auth0prompt=login
пара.
Вот как будет выглядеть URL-адрес:
https://example.auth0.com/authorize?
client_id=abcd1234
&redirect_uri= https://example.com/callback
&scope=openid profile
&response_type=id_token
&prompt=login
Вы можете найти больше информации об этом в этом документе Auth0: https://auth0.com/docs/authenticate/login/max-age-reauthentication
Это тоже нас раздражает. Почему в сеансе нет такого метода, как "очистить все куки"? Это решило бы эту проблему полностью. И это также останется в безопасности, так как вы не получите доступ к самим файлам cookie.
Подталкивая это и надеясь, что Apple предоставит решение для этого.
@ Посты ниже ASWebAuthenticationSession не являются какой-либо заменой, это скорее переименование SFAuthenticationSession. Я не вижу причин, по которым Apple не предоставит нам метод ClearSession или ClearCookies. ASWebAuthenticationSession или SFAuthenticationSession совершенно бесполезны, если только они не добавляют какой-либо рабочий процесс для фактического выхода из существующего сеанса.
Это зависит от того, какой файл cookie хранит ваши данные для входа;
Если это файл cookie сеанса, он не передается Safari в соответствии с https://developer.apple.com/documentation/authenticationservices/aswebauthenticationsession.
Итак, просто очистите локальный сеанс, и файлы cookie будут удалены при следующем запуске приложения.
Если нет, и файл cookie сохраняется, то, как сказал Мартин выше, вам следует открыть Safari (не SFSafariViewController
) с вашим URL-адресом выхода, а затем перенаправьте обратно в свое приложение.
Пожалуйста, дайте мне знать, если вам понадобится дополнительная информация. Я тщательно протестировал все 3 способа аутентификации (ASWebAuthenticationSession
, Safari и SFSafariViewController
).
У вас, ребята, есть какие-нибудь новости об этом? Я также на той же странице, что и вы, и не могу удалить файлы cookie и выйти из системы без необходимости показывать другую ASWebAuthenticationSession
SFSafariViewController
устарел в iOS 12. ASWebAuthenticationSession
хорошая замена для этого. https://developer.apple.com/documentation/authenticationservices/aswebauthenticationsession
Когда вы выйдете из системы с помощью SFAuthenticationSession, вы не получите обработчик завершения. Вы получите только обработчик отмены завершения, который одинаков для оповещения о разрешении и для кнопки отмены в контроллере просмотра аутентификации
Для iOS 13.0 необходимо добавить SceneDelegate.swift для UISceneConfiguration
Также необходимо обновить appdelegate для реализации UIScene.
Добавить жизненный цикл UISceneSession
Таким образом, проблема с SFAuthenticationSession работает нормально.