Внедрите безопасную аутентификацию Apple Sign-in в своем приложении

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

Это объявление привлекло много внимания пользователей и разработчиков, но теперь Apple сделала эту функцию обязательной с июля 2020 г. Войдите в LinkedIn, войдите в систему с помощью Amazon или WeChat Login), чтобы настроить или аутентифицировать основную учетную запись пользователя в приложении, также необходимо предложить вход с помощью Apple в качестве эквивалентного варианта.

Предварительные требования

В этом блоге я поделюсь с вами реализацией и необходимыми кейсами. Прежде чем вы начнете, для этого требуются как минимум Xcode 11 и iOS 13. После создания образца проекта вам необходимо настроить несколько вещей.

Настройка

  1. В своем проекте Xcode добавьте параметр «Войти с помощью Apple», чтобы получить доступ к этой службе в своем приложении. Цель приложения - Подписание и возможности - Добавить возможность Войдите в систему с помощью Apple.
  2. Убедитесь, что вы используете уникальный идентификатор приложения для этого проекта.
  3. Вам необходимо добавить службу Войти через Apple в свой идентификатор приложения и создать профиль отладки / тестирования для тестирования приложения на устройстве. Зайдите на портал Apple для разработчиков ›Аккаунт› Сертификаты, идентификаторы и профили.

Реализация

Перейдите в файл ContentView.Swift и импортируйте платформу AuthenticationServices.

Инициализируйте вход с помощью яблочной кнопки:

let button = ASAuthorizationAppleIDButton(authorizationButtonType: .signIn, authorizationButtonStyle: .black)

Я создал класс UIViewRepresentable для инициализации кнопки Apple и рендеринга в представлении содержимого.

Затем добавьте цель для кнопки, чтобы активировать функцию входа в ContentView.

Я создал «SecondView» для навигации после авторизации от Apple. Он работает с управлением состоянием, а для управления состоянием я создал переменную Int «actionState» с состоянием 0.

AppleSignInSwift().frame(width: 330, height: 50, alignment: .center).onTapGesture {
   self.signInTapped()
}
NavigationLink(destination: SecondView(), tag: 1, selection: $actionState) {
   Text("")
}

Аутентификация

Создайте целевую функцию кнопки из основного представления и добавьте функциональность для запроса авторизации.

  1. Он инициализирует запрос идентификатора Apple.
  2. Он обеспечивает требования к области для имени и электронной почты. Вы можете выбрать имя или адрес электронной почты в зависимости от ваших требований.
  3. Вызов функции для запуска ASAuthorizationController для отображения представления авторизации пользователя.

Я предпочитаю создать отдельный класс «AppleSignInDelegate» для функции делегата ASAuthorizationController, который, в свою очередь, выполняет обновления пользовательского интерфейса после авторизации.

Подтверждение

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

ПРИМЕЧАНИЕ. Обязательно сохраните необходимые данные пользователя в связке ключей устройства для дальнейшего использования, потому что Apple не предоставит все данные в следующий раз.

Вот два случая

  1. Первый вход - функция делегата возвращает учетные данные, и вы можете сохранить их в своей связке ключей для дальнейшего использования. Если пользователь переустановит ваше приложение, вы все равно сможете получить доступ к учетным данным с помощью связки ключей.
  2. Последующий вход - он возвращает только идентификатор пользователя, но не другую важную информацию, такую ​​как имя и адрес электронной почты, которые вы получили при первом входе в систему. Вам необходимо проверить статус авторизации и использовать сохраненные учетные данные из связки ключей для входа в систему.

Связка ключей

Я использовал стороннюю библиотеку KeychainSwift для хранения и получения учетных данных пользователя. К нему очень легко получить доступ, и я создал для него отдельную оболочку.

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

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

Вы можете проверить текущее состояние учетных данных зарегистрированного идентификатора Apple и обрабатывать обращения в соответствии с состоянием.

Примечания:

  1. Вход через Apple доступен в iOS 13 и новее.
  2. Добавьте опцию "Войти через Apple" в целевую возможность приложения.
  3. У пользователя есть возможность скрыть адрес электронной почты и имя. Взамен Apple предоставит вам уникальный адрес электронной почты для этого пользователя.
  4. Сохраните учетные данные в первый раз в связке ключей устройства для последующей аутентификации.
  5. Не забудьте зарегистрировать домен своего адреса электронной почты в учетной записи iTunes. Любые сообщения, отправленные на личный адрес клиента приложением или веб-сайтом, автоматически пересылаются на личный адрес электронной почты клиента через частную службу ретрансляции электронной почты, управляемую Apple.
  6. Пользователи могут внести изменения в ваш адрес электронной почты, имя или прекратить использование идентификатора Apple ID в приложении в настройках устройства. Перейдите в раздел «Настройки» ›Apple ID› Пароль и безопасность ›Apple ID для входа / приложения с помощью вашего Apple ID.

Заключение

Я надеюсь, что эта статья помогла вам понять, как реализовать вход через Apple, используя Swift UI. Предложения или улучшения приветствуются.

Спасибо за чтение 🙌🏼