Uwierzytelnij się za pomocą logowania Google na platformach Apple

Możesz pozwolić użytkownikom na uwierzytelnianie w Firebase przy użyciu ich kont Google, integrując logowanie Google ze swoją aplikacją.

Zanim zaczniesz

Użyj Menedżera pakietów Swift, aby zainstalować zależności Firebase i zarządzać nimi.

  1. W Xcode, przy otwartym projekcie aplikacji, przejdź do File > Add Packages .
  2. Po wyświetleniu monitu dodaj repozytorium SDK platform Firebase Apple:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Wybierz bibliotekę uwierzytelniania Firebase.
  5. Dodaj flagę -ObjC do sekcji Inne flagi linkera w ustawieniach kompilacji celu.
  6. Po zakończeniu Xcode automatycznie rozpocznie rozwiązywanie i pobieranie zależności w tle.

Dodaj pakiet SDK logowania Google do swojego projektu

  1. W Xcode, przy otwartym projekcie aplikacji, przejdź do File > Add Packages .

  2. Po wyświetleniu monitu dodaj repozytorium SDK logowania Google:

    https://github.com/google/GoogleSignIn-iOS
    
  3. Po zakończeniu Xcode automatycznie rozpocznie rozwiązywanie i pobieranie zależności w tle.

Włącz logowanie Google dla swojego projektu Firebase

Aby umożliwić użytkownikom logowanie się przy użyciu logowania Google, musisz najpierw włączyć dostawcę logowania Google dla swojego projektu 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 swojego projektu i skopiuj ją do projektu Xcode. Zastąp istniejące wersje nową. (Zobacz Dodawanie Firebase do projektu na iOS .)

Zaimportuj wymagane pliki nagłówkowe

Najpierw musisz zaimportować do swojej aplikacji pliki nagłówkowe Firebase SDK i Google Sign-In SDK.

Szybki

import FirebaseCore
import FirebaseAuth
import GoogleSignIn

Cel C

@import FirebaseCore;
@import GoogleSignIn;

Zaimplementuj logowanie Google

Zaimplementuj logowanie Google, wykonując poniższe kroki. Szczegółowe informacje na temat korzystania z logowania Google w systemie iOS można znaleźć w dokumentacji programisty dotyczącej logowania za pomocą Google.

  1. Dodaj niestandardowe schematy adresów URL do swojego projektu Xcode:
    1. Otwórz konfigurację projektu: kliknij nazwę projektu w lewym widoku drzewa. Wybierz swoją aplikację w sekcji CELE , następnie wybierz kartę Informacje i rozwiń sekcję Typy adresów URL .
    2. Kliknij przycisk + i dodaj schemat 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 go w polu Schematy adresów URL na stronie konfiguracji. Pozostałe pola pozostaw nietknięte.

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

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

    Szybki

    FirebaseApp.configure()
    

    Cel C

    // Use Firebase library to configure APIs
    [FIRApp configure];
    
  3. Zaimplementuj application:openURL:options: delegata aplikacji. Metoda powinna wywołać metodę handleURL instancji GIDSignIn , która prawidłowo obsłuży adres URL, który aplikacja otrzyma na koniec procesu uwierzytelniania.

    Szybki

    func application(_ app: UIApplication,
                     open url: URL,
                     options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
      return GIDSignIn.sharedInstance.handle(url)
    }
    

    Cel 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 prezentującego i identyfikator klienta aplikacji do metody signIn dostawcy logowania Google i utwórz dane uwierzytelniające Firebase na podstawie wynikowego tokena uwierzytelniania Google:

    Szybki

    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)
    
      // ...
    }
    

    Cel 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 jego instancję programowo. Aby dodać przycisk do scenorysu lub pliku XIB, dodaj View i ustaw jego klasę niestandardową na GIDSignInButton .
  6. Opcjonalnie : jeśli chcesz dostosować przycisk, wykonaj następujące czynności:

    Szybki

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

    Cel 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 signInButton właśnie właściwościąsignInButton.
    3. Dostosuj przycisk, ustawiając właściwości obiektu GIDsignInButton .

Uwierzytelnij się w Firebase

Na koniec zakończ proces logowania do Firebase, korzystając z danych uwierzytelniających utworzonych w poprzednim kroku.

Szybki

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

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

Cel 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;
  // ...
}];

Następne kroki

Gdy użytkownik zaloguje się po raz pierwszy, zostanie utworzone nowe konto użytkownika i powiązane z poświadczeniami — czyli nazwą użytkownika i hasłem, numerem telefonu lub informacjami o dostawcy uwierzytelniania — za pomocą których użytkownik się zalogował. To nowe konto jest przechowywane jako część Twojego projektu Firebase i może służyć do identyfikowania użytkownika w każdej aplikacji w Twoim projekcie, niezależnie od tego, w jaki sposób użytkownik się loguje.

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

  • W regułach bezpieczeństwa bazy danych Firebase Realtime i Cloud Storage możesz uzyskać unikalny identyfikator zalogowanego użytkownika ze zmiennej auth i użyć go do kontrolowania, do jakich danych użytkownik może uzyskać dostęp.

Możesz zezwolić użytkownikom na logowanie się do aplikacji przy użyciu wielu dostawców uwierzytelniania, łącząc poświadczenia dostawcy uwierzytelniania z istniejącym kontem użytkownika.

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

Szybki

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

Cel C

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

Możesz także dodać kod obsługi błędów dla pełnego zakresu błędów uwierzytelniania. Zobacz Błędy obsługi .