Назад к вопросам
Middle+
86
questionbank

Как реализовать авторизацию через Apple в приложении на iOS?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Для реализации авторизации через Apple (Sign In with Apple) на iOS приложении необходимы следующие шаги:

  1. Настроить приложение в Apple Developer Portal:

    • Включить Capability "Sign In with Apple" для вашего App ID.
    • Сгенерировать или обновить Provisioning Profile с включенной Capability.
  2. Добавить Capability "Sign In with Apple" в Xcode проект.

  3. Использовать фреймворк AuthenticationServices.

Пример кода для инициации запроса на авторизацию:

import AuthenticationServices

@available(iOS 13.0, *)
func performSignInWithApple() {
    // Создаем провайдер
    let appleIDProvider = ASAuthorizationAppleIDProvider()

    // Создаем запросы
    let request = appleIDProvider.createRequest()
    request.requestedScopes = [.fullName, .email] // Запрашиваем имя и почту пользователя

    // Создаем контроллер для обработки запросов
    let authorizationController = ASAuthorizationController(authorizationRequests: [request])

    // Устанавливаем делегаты для обработки ответов
    authorizationController.delegate = self
    authorizationController.presentationContextProvider = self

    // Запускаем процесс авторизации
    authorizationController.performRequests()
}

// Реализация делегатов
// ASAuthorizationControllerDelegate
@available(iOS 13.0, *)
extension YourViewController: ASAuthorizationControllerDelegate {
    // Обработка успешной авторизации
    func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
        if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {
            let userIdentifier = appleIDCredential.user // Уникальный идентификатор пользователя Apple
            let fullName = appleIDCredential.fullName // Имя пользователя
            let email = appleIDCredential.email // Почта пользователя (доступна только при первом входе)

            // Здесь можно отправить userIdentifier и другие данные на ваш сервер для верификации и создания/связывания учетной записи
            print("User ID: \(userIdentifier)")
            print("Full Name: \(fullName?.givenName ?? "") \(fullName?.familyName ?? "")")
            print("Email: \(email ?? "")")
        } else if let passwordCredential = authorization.credential as? ASPasswordCredential {
            // Пользователь использовал сохраненные пароли из iCloud Keychain
            let username = passwordCredential.user
            let password = passwordCredential.password
            // Здесь можно использовать эти данные для входа
            print("Username: \(username)")
            print("Password: \(password)")
        }
    }

    // Обработка ошибки авторизации
    func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
        print("Sign in with Apple failed: \(error.localizedDescription)")
        // Здесь обрабатываем ошибки (например, пользователь отменил авторизацию)
    }
}

// ASAuthorizationControllerPresentationContextProviding
@available(iOS 13.0, *)
extension YourViewController: ASAuthorizationControllerPresentationContextProviding {
    // Предоставляет окно, на котором будет показан интерфейс авторизации
    func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
        return view.window! // Важно вернуть НЕ nil window
    }
}

// TODO: Убедитесь, что YourViewController реализует необходимые протоколы.
  1. Обработать данные, полученные после успешной авторизации:
    • Используйте userIdentifier для уникальной идентификации пользователя Apple.
    • fullName и email доступны только при первом входе для данного пользователя и вашего приложения. Сохраните их.
    • Передайте userIdentifier, identityToken (содержит информацию для верификации на сервере) и authorizationCode на ваш сервер для верификации и создания/связывания учетной записи пользователя в вашей системе.
    • Сервер должен верифицировать "identityToken" с Apple, чтобы убедиться в подлинности запроса.

Помимо основной авторизации, также важно реализовать:

  • Обработку состояния авторизации пользователя (например, через ASAuthorizationAppleIDProvider().getCredentialState).
  • Возможность отзыва авторизации пользователем.
  • Взаимодействие с вашим бэкендом для создания/аутентификации пользователя после успешной авторизации через Apple.

Замечание: Sign In with Apple доступен только на устройствах с iOS 13 / macOS Catalina и новее. Для более старых версий ОС потребуется запасной механизм аутентификации.