Sobes.tech
Middle+

Jak zaimplementować autoryzację przez Apple w aplikacji na iOS?

sobes.tech AI

Odpowiedź od AI

Aby zaimplementować uwierzytelnianie za pomocą Apple (Sign In with Apple) w aplikacji iOS, konieczne są następujące kroki:

  1. Skonfiguruj aplikację w Apple Developer Portal:

    • Włącz funkcję "Sign In with Apple" dla swojego App ID.
    • Wygeneruj lub zaktualizuj Profil Provisioning z włączoną funkcją.
  2. Dodaj funkcję "Sign In with Apple" do projektu Xcode.

  3. Użyj frameworka AuthenticationServices.

Przykład kodu do inicjacji żądania uwierzytelnienia:

import AuthenticationServices

@available(iOS 13.0, *)
func performSignInWithApple() {
    // Utwórz dostawcę
    let appleIDProvider = ASAuthorizationAppleIDProvider()

    // Utwórz żądania
    let request = appleIDProvider.createRequest()
    request.requestedScopes = [.fullName, .email] // Żądaj imienia i e-mail użytkownika

    // Utwórz kontroler do obsługi żądań
    let authorizationController = ASAuthorizationController(authorizationRequests: [request])

    // Ustaw delegatów do obsługi odpowiedzi
    authorizationController.delegate = self
    authorizationController.presentationContextProvider = self

    // Rozpocznij proces uwierzytelniania
    authorizationController.performRequests()
}

// Implementacja delegatów
// ASAuthorizationControllerDelegate
@available(iOS 13.0, *)
extension YourViewController: ASAuthorizationControllerDelegate {
    // Obsługa udanego uwierzytelnienia
    func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
        if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {
            let userIdentifier = appleIDCredential.user // Unikalny identyfikator Apple
            let fullName = appleIDCredential.fullName // Imię użytkownika
            let email = appleIDCredential.email // E-mail użytkownika (dostępne tylko przy pierwszym logowaniu)

            // Tutaj możesz wysłać userIdentifier i inne dane na swój serwer
            print("User ID: \(userIdentifier)")
            print("Full Name: \(fullName?.givenName ?? "") \(fullName?.familyName ?? "")")
            print("Email: \(email ?? "")")
        } else if let passwordCredential = authorization.credential as? ASPasswordCredential {
            // Użytkownik użył zapisanych haseł z iCloud Keychain
            let username = passwordCredential.user
            let password = passwordCredential.password
            // Tutaj możesz użyć tych danych do logowania
            print("Username: \(username)")
            print("Password: \(password)")
        }
    }

    // Obsługa błędu uwierzytelnienia
    func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
        print("Nieudane logowanie przez Apple: \(error.localizedDescription)")
        // Obsłuż błędy tutaj
    }
}

// ASAuthorizationControllerPresentationContextProviding
@available(iOS 13.0, *)
extension YourViewController: ASAuthorizationControllerPresentationContextProviding {
    // Zapewnia okno, na którym będzie wyświetlany interfejs uwierzytelniania
    func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
        return view.window! // Ważne, aby zwrócić OKNO NIE-nulowe
    }
}

// TODO: Upewnij się, że YourViewController implementuje niezbędne protokoły.
  1. Przetwarzaj dane otrzymane po udanym uwierzytelnieniu:
    • Użyj userIdentifier do unikalnej identyfikacji użytkownika Apple.
    • fullName i email są dostępne tylko przy pierwszym logowaniu tego użytkownika i twojej aplikacji. Zapisz je.
    • Wyślij userIdentifier, identityToken (zawiera informacje do weryfikacji na serwerze) i authorizationCode na swój serwer do weryfikacji i tworzenia/łączenia konta użytkownika.
    • Serwer musi zweryfikować "identityToken" z Apple, aby upewnić się o autentyczności żądania.

Poza głównym uwierzytelnieniem, ważne jest również zaimplementowanie:

  • Zarządzania stanem autoryzacji użytkownika (np. przez ASAuthorizationAppleIDProvider().getCredentialState).
  • Możliwości odwołania autoryzacji przez użytkownika.
  • Interakcji z twoim backendem w celu tworzenia/uwierzytelniania użytkownika po udanym uwierzytelnieniu przez Apple.

Uwaga: Sign In with Apple jest dostępny tylko na urządzeniach z iOS 13 / macOS Catalina i nowszych. Dla starszych wersji wymagana jest alternatywna metoda uwierzytelniania.