Uwierzytelniaj za pomocą logowania przez Google na platformach Apple

Możesz umożliwić użytkownikom uwierzytelnianie się w Firebase przy użyciu ich kont Google, integrując logowanie Google z swoją aplikacją.

Zanim zaczniesz

Do instalacji zależności Firebase i zarządzania nimi możesz używać menedżera pakietów Swift.

  1. Po otwarciu projektu aplikacji w Xcode wybierz Plik > Dodaj pakiety.
  2. Gdy pojawi się prośba, dodaj repozytorium pakietu SDK Firebase na platformy Apple:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Wybierz bibliotekę Firebase Authentication.
  5. Dodaj flagę -ObjC do sekcji Inne flagi linkera w ustawieniach kompilacji docelowej.
  6. Gdy to zrobisz, Xcode automatycznie zacznie wyszukiwać i pobierać zależności w tle.

Dodawanie do projektu pakietu SDK logowania w Google

  1. Po otwarciu projektu aplikacji w Xcode wybierz Plik > Dodaj pakiety.

  2. Gdy pojawi się odpowiedni komunikat, dodaj repozytorium pakietu SDK logowania Google:

    https://github.com/google/GoogleSignIn-iOS
    
  3. Gdy to zrobisz, Xcode automatycznie zacznie wyszukiwać i pobierać zależności w tle.

Włącz logowanie przez Google w projekcie Firebase

Aby umożliwić użytkownikom logowanie się za pomocą usługi Logowanie przez Google, musisz najpierw włączyć dostawcę Logowania przez Google w projekcie Firebase:

  1. W konsoli Firebase otwórz sekcję Uwierzytelnianie.
  2. Na karcie Metoda logowania włącz dostawcę Google.
  3. Kliknij Zapisz.

  4. Pobierz nową kopię pliku GoogleService-Info.plist projektu i przekaż go do projektu Xcode. Zastąp wszystkie istniejące wersje nową. (zobacz Dodaj Firebase do projektu na iOS).

Importowanie wymaganych plików nagłówka

Najpierw musisz zaimportować do aplikacji pliki nagłówka pakietu SDK Firebase i pakietu SDK logowania się w Google.

import FirebaseCore
import FirebaseAuth
import GoogleSignIn
@import FirebaseCore;
@import GoogleSignIn;

Wdrożenie logowania Google

Aby wdrożyć logowanie przez Google, wykonaj te czynności. Szczegółowe informacje o używaniu funkcji Logowania w Google na urządzeniach z iOS znajdziesz w dokumentacji dla deweloperów dotyczącej Logowania w Google.

  1. Dodawanie niestandardowych schematów adresów URL do projektu Xcode:
    1. Otwórz konfigurację projektu: kliknij nazwę projektu w widoku drzewa po lewej stronie. W sekcji CELE wybierz swoją aplikację, a potem kliknij kolejno karty InformacjeTypy adresów URL.
    2. Kliknij przycisk + i dodaj schemat adresu URL dla odwróconego identyfikatora klienta. Aby znaleźć tę wartość, otwórz plik konfiguracji GoogleService-Info.plist i znajdź klucz REVERSED_CLIENT_ID. Skopiuj wartość tego klucza i wklej ją w polu Schematy URL na stronie konfiguracji. Pozostaw pozostałe pola bez zmian.

      Po zakończeniu konfiguracja powinna wyglądać mniej więcej tak (ale z wartościami odpowiednimi dla Twojej aplikacji):

  2. W metodzie application:didFinishLaunchingWithOptions: obiektu FirebaseApp w delegacie aplikacji skonfiguruj obiekt FirebaseApp.
    FirebaseApp.configure()
    // Use Firebase library to configure APIs
    [FIRApp configure];
  3. Zaimplementuj metodę application:openURL:options: w delegacie aplikacji. Metoda powinna wywoływać metodę handleURL instancji GIDSignIn, która odpowiednio obsłuży adres URL otrzymany przez Twoją aplikację na końcu procesu uwierzytelniania.
    func application(_ app: UIApplication,
                     open url: URL,
                     options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
      return GIDSignIn.sharedInstance.handle(url)
    }
    - (BOOL)application:(nonnull UIApplication *)application
                openURL:(nonnull NSURL *)url
                options:(nonnull NSDictionary<NSString *, id> *)options {
      return [[GIDSignIn sharedInstance] handleURL:url];
    }
  4. Przekaż kontroler wyświetlania widoku i identyfikator klienta swojej aplikacji do metody signIn dostawcy logowania w Google, a następnie utwórz dane logowania Firebase na podstawie otrzymanego tokena uwierzytelniania Google:
    guard let clientID = FirebaseApp.app()?.options.clientID else { return }
    
    // Create Google Sign In configuration object.
    let config = GIDConfiguration(clientID: clientID)
    GIDSignIn.sharedInstance.configuration = config
    
    // Start the sign in flow!
    GIDSignIn.sharedInstance.signIn(withPresenting: self) { [unowned self] result, error in
      guard error == nil else {
        // ...
      }
    
      guard let user = result?.user,
        let idToken = user.idToken?.tokenString
      else {
        // ...
      }
    
      let credential = GoogleAuthProvider.credential(withIDToken: idToken,
                                                     accessToken: user.accessToken.tokenString)
    
      // ...
    }
    GIDConfiguration *config = [[GIDConfiguration alloc] initWithClientID:[FIRApp defaultApp].options.clientID];
    [GIDSignIn.sharedInstance setConfiguration:config];
    
    __weak __auto_type weakSelf = self;
    [GIDSignIn.sharedInstance signInWithPresentingViewController:self
          completion:^(GIDSignInResult * _Nullable result, NSError * _Nullable error) {
      __auto_type strongSelf = weakSelf;
      if (strongSelf == nil) { return; }
    
      if (error == nil) {
        FIRAuthCredential *credential =
        [FIRGoogleAuthProvider credentialWithIDToken:result.user.idToken.tokenString
                                         accessToken:result.user.accessToken.tokenString];
        // ...
      } else {
        // ...
      }
    }];
  5. Dodaj GIDSignInButton do storyboardu lub pliku XIB albo utwórz go za pomocą kodu. Aby dodać przycisk do storyboardu lub pliku XIB, dodaj widok i ustaw jego klasę niestandardową naGIDSignInButton.
  6. Opcjonalnie: jeśli chcesz dostosować przycisk, wykonaj te czynności:
    1. W kontrolerze widoku zadeklaruj przycisk logowania jako właściwość.
      @IBOutlet weak var signInButton: GIDSignInButton!
    2. Połącz przycisk z usługą signInButton, którą właśnie zadeklarowałeś/zadeklarowałaś.
    3. Dostosuj przycisk, ustawiając właściwości obiektu GIDSignInButton.
    1. W pliku nagłówka kontrolera widoku zadeklaruj przycisk logowania jako właściwość.
      @property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton;
    2. Połącz przycisk z usługą signInButton, którą właśnie zadeklarowałeś/zadeklarowałaś.
    3. Dostosuj przycisk, ustawiając właściwości obiektu GIDSignInButton.

Uwierzytelnienie za pomocą Firebase

Na koniec ukończ proces logowania w Firebase, używając danych logowania utworzonych w poprzednim kroku.

Auth.auth().signIn(with: credential) { result, error in

  // At this point, our user is signed in
}
    
[[FIRAuth auth] signInWithCredential:credential
                          completion:^(FIRAuthDataResult * _Nullable authResult,
                                       NSError * _Nullable error) {
    if (isMFAEnabled && error && error.code == FIRAuthErrorCodeSecondFactorRequired) {
      FIRMultiFactorResolver *resolver = error.userInfo[FIRAuthErrorUserInfoMultiFactorResolverKey];
      NSMutableString *displayNameString = [NSMutableString string];
      for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) {
        [displayNameString appendString:tmpFactorInfo.displayName];
        [displayNameString appendString:@" "];
      }
      [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Select factor to sign in\n%@", displayNameString]
                           completionBlock:^(BOOL userPressedOK, NSString *_Nullable displayName) {
       FIRPhoneMultiFactorInfo* selectedHint;
       for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) {
         if ([displayName isEqualToString:tmpFactorInfo.displayName]) {
           selectedHint = (FIRPhoneMultiFactorInfo *)tmpFactorInfo;
         }
       }
       [FIRPhoneAuthProvider.provider
        verifyPhoneNumberWithMultiFactorInfo:selectedHint
        UIDelegate:nil
        multiFactorSession:resolver.session
        completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
          if (error) {
            [self showMessagePrompt:error.localizedDescription];
          } else {
            [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Verification code for %@", selectedHint.displayName]
                                 completionBlock:^(BOOL userPressedOK, NSString *_Nullable verificationCode) {
             FIRPhoneAuthCredential *credential =
                 [[FIRPhoneAuthProvider provider] credentialWithVerificationID:verificationID
                                                              verificationCode:verificationCode];
             FIRMultiFactorAssertion *assertion = [FIRPhoneMultiFactorGenerator assertionWithCredential:credential];
             [resolver resolveSignInWithAssertion:assertion completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
               if (error) {
                 [self showMessagePrompt:error.localizedDescription];
               } else {
                 NSLog(@"Multi factor finanlize sign in succeeded.");
               }
             }];
           }];
          }
        }];
     }];
    }
  else if (error) {
    // ...
    return;
  }
  // User successfully signed in. Get user data from the FIRUser object
  if (authResult == nil) { return; }
  FIRUser *user = authResult.user;
  // ...
}];

Dalsze kroki

Gdy użytkownik zaloguje się po raz pierwszy, zostanie utworzone nowe konto użytkownika i połączone z danymi logowania, czyli nazwą użytkownika i hasłem, numerem telefonu lub informacjami dostawcy uwierzytelniania. To nowe konto jest przechowywane w projekcie Firebase i może służyć do identyfikowania użytkownika we wszystkich aplikacjach w projekcie, niezależnie od tego, jak użytkownik się loguje.

  • W swoich aplikacjach możesz pobrać podstawowe informacje o profilu użytkownika z obiektu User . Zobacz Zarządzanie użytkownikami.

  • W regułach Firebase Realtime DatabaseCloud Storage Regułach bezpieczeństwa możesz pobrać z zmiennej auth unikalny identyfikator zalogowanego użytkownika i użyć go do kontrolowania dostępu użytkownika do danych.

Możesz zezwolić użytkownikom na logowanie się w aplikacji za pomocą danych logowania od wielu dostawców uwierzytelniania, połączając je z dotychczasowym kontem użytkownika.

Aby wylogować użytkownika, zadzwoń pod numer signOut:.

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}
NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

Możesz też dodać kod do obsługi błędów w całym zakresie błędów uwierzytelniania. Zobacz Obsługa błędów.