Uwierzytelniaj za pomocą logowania przez Google na platformach Apple

Możesz zezwolić użytkownikom na uwierzytelnianie się w Firebase za pomocą kont Google, integrując Logowanie przez Google z aplikacją.

Zanim zaczniesz

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

  1. Po otwarciu projektu aplikacji wybierz w Xcode opcję File > Add Packages (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 Other Linker Flags (Inne flagi linkera) w ustawieniach kompilacji celu.
  6. Gdy skończysz, Xcode zacznie automatycznie wyszukiwać i pobierać Twoje zależności w tle.

Dodawanie pakietu SDK Logowania przez Google do projektu

  1. Po otwarciu projektu aplikacji wybierz w Xcode opcję File > Add Packages (Plik > Dodaj pakiety).

  2. Gdy pojawi się prośba, dodaj repozytorium pakietu SDK Logowania przez Google:

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

Włączanie logowania przez Google w projekcie w Firebase

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

  1. W konsoli Firebaseotwórz sekcję Authentication (Uwierzytelnianie).
  2. Na karcie Sign in method (Metoda logowania) włącz dostawcę Google.
  3. Kliknij Save (Zapisz).

  4. Pobierz nową kopię pliku GoogleService-Info.plist projektu i skopiuj ją do projektu Xcode. Zastąp wszystkie dotychczasowe wersje nową. (Zobacz Dodawanie Firebase do projektu na iOS).

Importowanie wymaganych plików nagłówkowych

Najpierw musisz zaimportować do aplikacji pliki nagłówkowe pakietu SDK Firebase i pakietu SDK Logowania przez Google.

Swift

import FirebaseAuth
import GoogleSignIn

Objective-C

@import FirebaseCore;
@import GoogleSignIn;

Wdrożenie Logowania przez Google

Wdróż Logowanie przez Google, wykonując te czynności. Więcej informacji o korzystaniu z Logowania przez Google na iOS znajdziesz w dokumentacji dla deweloperów Logowania przez Google.

  1. Dodaj niestandardowe schematy adresów URL do projektu Xcode:
    1. Otwórz konfigurację projektu: kliknij nazwę projektu w widoku drzewa po lewej stronie widoku. W sekcji TARGETS wybierz aplikację, a następnie kliknij kartę Info i rozwiń sekcję URL Types.
    2. Kliknij przycisk + i dodaj schemat URI adresu URL dla odwróconego identyfikatora klienta. Aby znaleźć tę wartość, otwórz plik konfiguracyjny GoogleService-Info.plist i poszukaj klucza REVERSED_CLIENT_ID. Skopiuj wartość tego klucza, i wklej ją w polu URL Schemes na stronie konfiguracji. Pozostałe pola pozostaw bez zmian.

      Po zakończeniu konfiguracja powinna wyglądać podobnie do tej (ale z wartościami specyficznymi dla aplikacji):

  2. W metodzie application:didFinishLaunchingWithOptions: delegata aplikacji skonfiguruj obiekt FirebaseApp.

    Swift

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  3. Zaimplementuj metodę application:openURL:options: delegata aplikacji. Metoda powinna wywoływać metodę handleURL instancji GIDSignIn, która prawidłowo obsłuży adres URL otrzymany przez aplikację na końcu procesu uwierzytelniania.

    Swift

    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
      // ...
    }
      return GIDSignIn.sharedInstance.handle(url)
    }

    Objective-C

    - (BOOL)application:(nonnull UIApplication *)application
                openURL:(nonnull NSURL *)url
                options:(nonnull NSDictionary<NSString *, id> *)options {
      return [[GIDSignIn sharedInstance] handleURL:url];
    }
  4. Przekaż kontroler widoku prezentacji i identyfikator klienta aplikacji do metody signIn dostawcy Logowania przez Google i utwórz dane uwierzytelniające do Uwierzytelniania Firebase na podstawie otrzymanego tokena uwierzytelniania Google:

    Swift

    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: viewController) { result, error in
      guard error == nil else {
        // ...
        return
      }
    
      guard let user = result?.user,
            let idToken = user.idToken?.tokenString
      else {
        // ...
        return
      }
    
      let credential = GoogleAuthProvider.credential(withIDToken: idToken,
                                                     accessToken: user.accessToken.tokenString)
      self.signIn(with: credential)
    }

    Objective-C

    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 scenorysu, pliku XIB lub utwórz go programowo. Aby dodać przycisk do scenorysu lub pliku XIB file, dodaj widok i ustaw jego niestandardową klasę na GIDSignInButton.
  6. Opcjonalnie: jeśli chcesz dostosować przycisk, wykonaj te czynności:

    Swift

    1. W kontrolerze widoku zadeklaruj przycisk logowania jako właściwość.
      @IBOutlet weak var signInButton: GIDSignInButton!
    2. Połącz przycisk z właśnie zadeklarowaną właściwością signInButton.
    3. Dostosuj przycisk, ustawiając właściwości obiektu GIDSignInButton.

    Objective-C

    1. W pliku nagłówkowym kontrolera widoku zadeklaruj przycisk logowania jako właściwość.
      @property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton;
    2. Połącz przycisk z właśnie zadeklarowaną właściwością signInButton.
    3. Dostosuj przycisk, ustawiając właściwości obiektu GIDSignInButton.

Uwierzytelnianie w Firebase

Na koniec dokończ proces logowania w Firebase za pomocą danych logowania utworzonych w poprzednim kroku.

Swift

Auth.auth().signIn(with: credential) { result, error in
  guard error == nil else {
    // ...
    return
  }

  // At this point, our user is signed in
}
    

Objective-C

[[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 – nazwą użytkownika i hasłem, numerem telefonu lub informacjami o dostawcy uwierzytelniania. To nowe konto jest przechowywane jako część projektu w Firebase i może służyć do identyfikowania użytkownika w każdej aplikacji w projekcie, niezależnie od sposobu logowania.

Możesz zezwolić użytkownikom na logowanie się w aplikacji za pomocą wielu dostawców uwierzytelniania przez połączenie danych logowania dostawcy uwierzytelniania z istniejącym kontem użytkownika.

Aby wylogować użytkownika, wywołaj polecenie signOut:.

Swift

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}

Objective-C

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

Możesz też dodać kod obsługi błędów, aby obsługiwać wszystkie błędy uwierzytelniania błędów. Zobacz Obsługa błędów.