Sobes.tech
Middle+

Как да реализираме авторизация чрез Apple в приложение за iOS?

sobes.tech AI

Отговор от 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. Използвайте framework 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()
}

// Реализация на делегати
@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
            let fullName = appleIDCredential.fullName
            let email = appleIDCredential.email
            print("User ID: \(userIdentifier)")
            print("Full Name: \(fullName?.givenName ?? "") \(fullName?.familyName ?? "")")
            print("Email: \(email ?? "")")
        } else if let passwordCredential = authorization.credential as? ASPasswordCredential {
            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!
    }
}

// Обработка на данните след успешна автентикация:
// Използвайте `userIdentifier` за уникална идентификация на потребителя Apple.
// `fullName` и `email` са налични само при първия вход за този потребител и вашето приложение. Запазете ги.
// Изпратете `userIdentifier`, `identityToken` (съдържа информация за верификация на сървъра) и `authorizationCode` на вашия сървър за верификация и създаване/свързване на потребителски акаунт.
// Сървърът трябва да верифицира `identityToken` с Apple, за да се увери в автентичността на заявката.

Освен основната автентикация, е важно да реализирате:

* Проверка на състоянието на автентикация на потребителя (например чрез `ASAuthorizationAppleIDProvider().getCredentialState`).
* Възможност за оттегляне на автентикацията от потребителя.
* Взаимодействие с вашия бекенд за създаване/автентикиране на потребителя след успешна автентикация чрез Apple.

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