Программирование
Все, что вы хотели знать о функции Sign in with Apple
На мой взгляд, анонс сервиса Sign in with Apple, который был представлен на WWDC 2019, является одним из интереснейших, если брать во внимание вопрос приватности и конфиденциальности пользовательских данных.
Владислав Вчерашний, iOS-разработчик, рассказывает про тонкости работы с системой авторизации Sign in with Apple.
В ожидании WWDC 2020, которая, к слову, впервые будет проходить в онлайн режиме из-за всем известных событий, предлагаю вспомнить интересные (пока еще) новинки (зачеркнуто) с прошлогодней конференции разработчиков Apple.
Введение
На мой взгляд, анонс сервиса Sign in with Apple, который был представлен на WWDC 2019, является одним из интереснейших, если брать во внимание вопрос приватности и конфиденциальности пользовательских данных.
Сервис Sign in with Apple – это, своего рода альтернатива уже существующей возможности авторизоваться на сайте и/или в приложении через Facebook / Google / Twitter / LinkedIn и другие подобные сервисы. Уже очень давно эти функции стали для нас привычными и удобными, а теперь к этому долгому списку добавляется еще одна, но уже от компании Apple. Так зачем же это нам? Давайте разбираться.
Приступая к работе с Sign in with Apple
Важно: для использования Sign In with Apple у вас должен быть куплен аккаунт разработчика.
Первым делом открываем (создаём) проект и переходим во вкладку Project Navigator > Select your target > Signing and Capabilities tab и добавляем “Sign In with Apple”.
Следующим шагом переходим в ViewController и импортируем библиотеку AuthenticationServices:
import AuthenticationServices
Далее нам нужно добавить кнопку на экран. Делается это очень просто и всего в несколько строчек кода:
let signInButton = ASAuthorizationAppleIDButton(type: .default, style: .black) signInButton.addTarget(self, action: #selector(authorize), for: .touchUpInside)
Кнопку можно легко кастомизировать, на ваш выбор доступны 3 разных стиля (.black, .white и .whiteOutline) и типов (.signIn, .signUp и .continue). Также у Apple есть подробные и прекрасные гайдлайны здесь.
После добавления кнопки нам нужно добавить обработку действия по нажатию на неё:
@objc private func authorize() { let request = ASAuthorizationAppleIDProvider().createRequest() request.requestedScopes = [.fullName, .email] let controller = ASAuthorizationController(authorizationRequests: [request]) controller.delegate = self controller.presentationContextProvider = self controller.performRequests() }
Здесь мы:
- Создаём запрос и описываем необходимый скоуп данных (например: имя и почта)
- Создаём ASAuthorizationController и задаем его делегат
- Выполняем созданный запрос
И последнее что нужно сделать –– это подключить контроллер к протоколам ASAuthorizationControllerPresentationContextProviding и ASAuthorizationControllerDelegate, и реализовать их.
extension ViewController: ASAuthorizationControllerPresentationContextProviding { func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor { return view.window ?? UIWindow() } }
Важно знать: реализация протокола ASAuthorizationControllerPresentationContextProviding необязательная. Это нужно для корректного отображения окна входа.
extension ViewController: ASAuthorizationControllerDelegate { func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) { switch authorization.credential { case let credential as AS Authorization Apple ID Credential: let userId = credential.user print("User Identifier: ", userId) if let fullname = credential.fullName { print(fullname) } if let email = credential.email { print("Email: ", email) } default: break } } func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) { print("Error: \(error.localizedDescription)") } }
Важно знать: после первой авторизации вам больше не будут доступны данные пользователя. Убедитесь в правильном сохранении данных сразу.
После регистрации и сохранения пользователя его актуальность и легитимность время от времени нужно сверять с данными Apple:
private func verifyUser() { let provider = ASAuthorizationAppleIDProvider() provider.getCredentialState(forUserID: "Saved user id") { (state, error) in switch state { case .authorized: print("authorized") case .notFound: print("User not found") case .revoked: print("Apple has revoked user") case .transferred: print("Transfered") @unknown default: break } } }
Пользовательская сторона
Как проходит авторизация со стороны пользователя? Все очень просто, а главное – удобно:
- Нажать на кнопку Sign In with Apple
- Выбрать информацию, которую будет видно разработчику в показанном окне
- Подтвердить регистрацию через Face ID/Touch ID
Все, учетная запись создана! Стоит отметить, что Apple ID защищена двухфакторной аутентификацией, а также учетная запись не имеет пароля, это значит, что ее украсть будет невозможно.
К слову о приватности. Если пользователь решит не передавать свой адрес электронной почты, Apple создаст некий виртуальный адрес и передаст его разработчику. На него впоследствии и будут приходить “письма счастья”.
По словам Apple, функция Sign In with Apple будет обязательной для всех приложений, которые используют возможность авторизации через социальные сети (Google, Facebook и пр.). Если же разработчик откажется от внедрения этой функции, он обязан также убрать и другие кнопки социальных сетей.
Работать новая функция будет не только на всех платформах компании Apple, но и на веб-сайтах и в приложениях Android и Windows — с помощью представленной библиотеки на JavaScript.
Вывод
Вы еще не поняли зачем вам это нужно и в чем разница относительно других сервисов? При входе в приложение через Facebook/Google пользователь передает всю информацию о том, какое приложение и когда используется, и пользователь не имеет достаточного контроля над приватностью (при входе пользователь разрешает или запрещает доступ к определенным данным), а вот что получит Google или Facebook из этого приложения – простите-извините, вам знать не положено.
Как говорит сам Facebook в своей политике конфиденциальности: мы можем получить информацию об устройстве, посещенных сайтах, покупках, увиденной рекламе и использовании служб. Собственно, последние скандалы вокруг Facebook тонко намекают, что нужно дважды подумать, стоит ли доверять компании столько личной информации, которая впоследствии может быть передана другим компаниям.
Я бы хотел еще отметить важную деталь. Я уверен в компании Apple и в том, что ее целью является не сбор дополнительных персональных данных пользователей, а наоборот – минимизация возможных утечек данных в других приложениях, которые сама Apple контролировать не в состоянии.
Исходный код проекта доступен здесь.
Также официальная документация по Sign In with Apple здесь.
-
Разработка1 месяц назад
Прекратите спорить в Code Review — начните внедрять с правилами линтера
-
Разработка1 месяц назад
Разработка, управляемая тестами (TDD), для исправления ошибок
-
Исследования1 месяц назад
Приложения с подпиской 2024 — отчет RevenueCat
-
Статьи1 месяц назад
Как Google испортил свою открытую культуру и скомпрометировал свой продукт