Правильная обработка входа, выхода и отзыва учетных данных Apple

В этой статье мы рассмотрим, как вы можете интегрировать «Войти через Apple» с приложением, использующим аутентификацию Firebase. Прежде чем мы начнем, вам нужно подготовиться к нескольким вещам, чтобы мы начали интеграцию.

Предпосылки

Добавьте Firebase в свой проект iOS

Вам нужно будет добавить Firebase SDK в свой проект iOS и соответствующим образом настроить Firebase Console. Ознакомьтесь с этим руководством от Google для получения дополнительной информации о том, как это можно сделать.

Добавьте «Войти через Apple» в свой проект iOS

Вам также необходимо настроить свое приложение, чтобы иметь возможность использовать новую функцию Войти через Apple, представленную в iOS 13. Вот отличное руководство о том, как настроить ваше приложение, а также портал для разработчиков Apple.

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

С учетом всего этого, при условии, что вы выполнили настройку, ваше приложение должно иметь возможность отображать форму авторизации Apple, которая позволяет пользователям входить в систему со своим Apple ID. Кроме того, необходимо правильно установить Firebase SDK.

А теперь пора перейти к самому интересному - Интеграция «Войти через Apple» с Firebase Authentication.

Включить Apple как метод входа

Прежде чем мы перейдем к кодированию, вы должны сначала сообщить Firebase, что вы хотите использовать Apple в качестве одного из поставщиков услуг входа.

Для этого перейдите в консоль Firebase и перейдите на вкладку «Метод входа» в разделе «Аутентификация».

Найдите «Apple» в списке поставщиков, а затем нажмите переключатель «Включить», чтобы включить Apple в качестве поставщика услуг входа. Вы можете оставить все остальные поля пустыми и нажать «Сохранить».

Это должно сделать это, давайте вернемся в Xcode и начнем работать над кодом.

Создать безопасный одноразовый номер

Согласно документации Firebase, первый шаг, который нам нужно сделать, - это сгенерировать криптографически безопасный одноразовый номер, а затем использовать его при запросе авторизации от Apple. К счастью, код для генерации одноразового номера был предоставлен Firebase.

Во-первых, давайте импортируем модуль CryptoKit.

import CryptoKit

После этого скопируйте следующие 2 функции в контроллер представления, который содержит кнопку «Войти через Apple».

Затем обновите код, в котором вы представляете ASAuthorizationController.

После успешной авторизации Apple передаст хешированный одноразовый номер SHA256 без изменений методу делегата authorizationController(:didCompleteWithAuthorization:).

В следующем разделе мы рассмотрим, как мы можем использовать одноразовый номер для аутентификации с помощью Firebase.

Обработка входа в Apple успешно завершена

В методе делегата authorizationController(:didCompleteWithAuthorization:) извлеките объект учетных данных из заданного экземпляра ASAuthorization.

После получения объекта учетных данных извлеките идентификатор авторизованного пользователя и сохраните его в UserDefaults. Причина сохранения идентификатора пользователя заключается в том, что идентификатор пользователя требуется при выполнении проверки состояния учетных данных Apple ID. (подробнее об этом позже)

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

После создания объекта учетных данных Firebase аутентификация с помощью Firebase - это простой вызов функции.

Таким образом, вы успешно интегрировали «Войти через Apple» с Firebase Authentication.

Чтобы проверить всю свою тяжелую работу, нажмите кнопку «Выполнить» и выполните вход в систему, используя образец приложения. После успешного входа в систему перейдите в Firebase Console, вы увидите, что пользователь был создан.

Обновить отображаемое имя

По умолчанию Firebase Authentication не сохраняет отображаемое имя пользователя при создании нового пользователя в Firebase Console. Однако в большинстве случаев вы хотите сохранить отображаемое имя пользователя во время создания пользователя.

К счастью, это можно легко сделать, отправив запрос на изменение профиля пользователя на сервер Firebase.

Вы можете вставить указанный выше блок кода в обработчик завершения входа Firebase. При этом Firebase сохранит отображаемое имя пользователя после успешного входа в систему.

Вот полная реализация метода делегата authorizationController(:didCompleteWithAuthorization:).

Обработка выхода пользователя из системы

Обычная практика выхода из системы аутентификации Firebase включает в себя 2 шага:

  1. Выйдите из системы соответствующего поставщика услуг входа (в нашем случае это Apple).
  2. Выйти из Firebase

Давайте рассмотрим каждый шаг более подробно.

Выйти из Apple

Согласно документации Apple, Apple не предоставляет API для выхода. Это имеет смысл, потому что пользователи могут выйти из Apple, только отозвав свои учетные данные Apple ID в приложении «Настройки».

Следовательно, нам не нужно ничего делать для выхода пользователя из Apple, нам нужно только удалить сохраненный идентификатор пользователя из UserDefaults, и все готово.

Обратите внимание, что если ваше приложение поддерживает вход с использованием нескольких поставщиков входа, может потребоваться дополнительная обработка для получения идентификатора поставщика. Однако я не буду вдаваться в подробности, поскольку это выходит за рамки данной статьи.

Выйти из Firebase

Чтобы выйти из Firebase, мы можем просто использовать метод signOut(), предоставляемый Firebase SDK.

Auth.auth().signOut()

Вот и все, для выхода из Firebase особо ничего делать не нужно.

Вот полная реализация метода выхода.

Обработка отзыва учетных данных Apple

Как упоминалось в предыдущем разделе, пользователи могут отозвать учетные данные Apple ID в приложении «Настройки». Когда это произойдет, нам придется очистить сохраненный идентификатор пользователя и выйти из Firebase.

При аннулировании учетных данных Apple ID необходимо обрабатывать две ситуации:

  1. Учетные данные отзываются, когда приложение находится в фоновом режиме.
  2. Учетные данные аннулируются при завершении работы приложения.

Нам придется рассматривать обе упомянутые выше ситуации по отдельности.

Обработка отзыва учетных данных, когда приложение работает в фоновом режиме

Согласно документации Apple, уведомление будет опубликовано, когда учетные данные Apple ID приложения будут отозваны. Мы можем использовать это уведомление и соответствующим образом выполнить выход из системы.

Идите вперед и зарегистрируйтесь в уведомлении в viewWillAppear(_:) методе вашего контроллера представления.

После этого реализуем метод appleIDStateDidRevoked(_:).

Обратите внимание, что нам нужно убедиться, что пользователь действительно вошел в систему Apple, прежде чем вызывать метод signOut(), чтобы избежать случайного выхода пользователя из системы.

Наконец, не забудьте отказаться от уведомления в методе viewDidDisappear(_:).

Обработка отзыва учетных данных при завершении работы приложения

Когда приложение закрывается, получать уведомления невозможно. Таким образом, мы не можем полагаться на credentialRevokedNotification, чтобы уведомить нас об отзыве.

В этом случае нам придется вручную проверять состояние учетных данных Apple ID во время запуска приложения. Чтобы проверить состояние учетных данных Apple ID, мы можем использовать метод getCredentialState(forUserID::), предоставленный Apple.

В целях тестирования вы можете поместить указанный выше блок кода в метод viewDidLoad() вашего контроллера представления, который содержит кнопку «Войти с помощью Apple». Однако в большинстве случаев вы можете добавить его в метод AppDelegate application(_:didFinishLaunchingWithOptions:).

Вот и все, теперь ваше приложение полностью интегрировано с функцией «Войти через Apple» с помощью Firebase Authentication.

Выводы

Шаги, необходимые для интеграции «Войти через Apple» с Firebase, на самом деле довольно просты. Напомним, что мы сделали для интеграции:

  1. Включите Apple в качестве поставщика входа в Firebase Console.
  2. Войдите в Firebase после того, как пользователи успешно вошли в систему с Apple.
  3. Удалите сохраненный идентификатор пользователя после выхода пользователей из Firebase.
  4. Выйдите из Firebase, если пользователи отозвали учетные данные Apple ID, когда приложение работает в фоновом режиме.
  5. Выйдите из Firebase во время запуска приложения, если пользователи отозвали учетные данные Apple ID, когда приложение было закрыто.

Обратите внимание, что в этой статье предполагается, что Apple является единственным поставщиком входа для приложения. Если ваше приложение имеет более одного поставщика услуг входа, вам может потребоваться изменить соответствующий пример кода соответствующим образом.

Дополнительная литература

Я надеюсь, что эта статья даст вам хорошее и ясное представление о том, как интегрировать «Войти через Apple» с Firebase Authentication.

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

Следуйте за мной в Twitter, чтобы увидеть больше статей, связанных с разработкой для iOS.

Спасибо за прочтение.

Первоначально опубликовано на https://swiftsenpai.com 14 марта 2020 г.