Uwierzytelniaj za pomocą logowania przez Google na platformach Apple

Aby zezwolić użytkownikom na uwierzytelnianie w Firebase za pomocą kont Google: integrowanie Logowania przez Google z aplikacją.

Zanim zaczniesz

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

  1. W Xcode po otwarciu projektu aplikacji przejdź do File > Dodaj pakiety.
  2. Gdy pojawi się prośba, dodaj repozytorium SDK platform Apple Platform SDK Firebase:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Wybierz bibliotekę uwierzytelniania Firebase.
  5. Dodaj flagę -ObjC do sekcji Inne flagi łączące w ustawieniach kompilacji celu.
  6. Po zakończeniu Xcode automatycznie rozpocznie rozpoznawanie i pobieranie lub zależności w tle.

Dodaj do projektu pakiet SDK Google Sign-In

  1. W Xcode po otwarciu projektu aplikacji przejdź do File > Dodaj pakiety.

  2. Gdy pojawi się prośba, dodaj repozytorium pakietu SDK Google Sign-In:

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

Włączanie Logowania przez Google w projekcie Firebase

Aby użytkownicy mogli logować się za pomocą Logowania przez Google, musisz najpierw włączyć Dostawca Logowania przez Google dla Twojego 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 projektu i skopiuj go do projektu Xcode. Zastąp wszystkie istniejące wersje nową wersją jeden. (Zobacz Dodawanie Firebase do iOS projekt).

Zaimportuj wymagane pliki nagłówka

Najpierw musisz zaimportować pakiet SDK Firebase oraz pliki nagłówka pakietu SDK do logowania się przez Google do do aplikacji.

Swift

import FirebaseCore
import FirebaseAuth
import GoogleSignIn

Objective-C

@import FirebaseCore;
@import GoogleSignIn;

Wdrożenie logowania Google

Wdróż logowanie przez Google, wykonując te czynności. Zobacz Logowanie przez Google dokumentacji dla deweloperów, która zawiera szczegółowe informacje o korzystaniu z usług Google Zaloguj się przez iOS.

  1. Dodaj niestandardowe schematy adresów URL do projektu Xcode:
    1. Otwórz konfigurację projektu: kliknij nazwę projektu w drzewie po lewej stronie. widok. Wybierz aplikację w sekcji CELE, a potem wybierz kartę Informacje i rozwiń sekcję Typy adresów URL.
    2. Kliknij przycisk + i dodaj schemat adresu URL dla odwrotnej strony internetowej. identyfikatora klienta. Aby znaleźć tę wartość, otwórz GoogleService-Info.plist plik konfiguracji i odszukaj plik klawisz REVERSED_CLIENT_ID. Skopiuj wartość tego klucza. i wklej go w polu Schematy adresów URL na stronie konfiguracji. Pozostaw pozostałe pola bez zmian.

      Po zakończeniu konfiguracja powinna wyglądać podobnie do następujące (ale z wartościami związanymi z daną aplikacją):

  2. Na koncie application:didFinishLaunchingWithOptions: przedstawiciela aplikacji skonfiguruj obiekt FirebaseApp.

    Swift

    FirebaseApp.configure()
    

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
    
  3. Wdróż metodę application:openURL:options: w swojej aplikacji uzyskać dostęp. Metoda powinna wywoływać metodę handleURL funkcji GIDSignIn, która będzie prawidłowo obsługiwała adres URL który jest odbierany przez aplikację na końcu procesu uwierzytelniania.

    Swift

    func application(_ app: UIApplication,
                     open url: URL,
                     options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
      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 Metoda signIn dostawcy Logowania przez Google i utwórz Firebase Dane uwierzytelniające z wynikowego 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: 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)
    
      // ...
    }
    

    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 automatycznie utworzyć jej instancję. Aby dodać przycisk do scenorysu lub XIB dodaj widok i ustaw jego klasę niestandardową na GIDSignInButton
  6. Opcjonalnie: jeśli chcesz dostosować przycisk, wykonaj :

    Swift

    1. W kontrolerze widoków zadeklaruj przycisk logowania jako właściwość.
      @IBOutlet weak var signInButton: GIDSignInButton!
    2. Połącz przycisk z usługą signInButton, którą przed chwilą zadeklarowano.
    3. Dostosuj przycisk, ustawiając właściwości elementu GIDSignInButton.

    Objective-C

    1. W pliku nagłówkowym kontrolera widoku zadeklaruj przycisk logowania jako usłudze.
      @property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton;
    2. Połącz przycisk z usługą signInButton, którą przed chwilą zadeklarowano.
    3. Dostosuj przycisk, ustawiając właściwości elementu GIDSignInButton.

Uwierzytelnij za pomocą Firebase

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

Swift

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

  // 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, tworzone jest nowe konto użytkownika. powiązane z danymi logowania, czyli z nazwą użytkownika, hasłem i numerem telefonu, numer telefonu lub informacje o dostawcy uwierzytelniania – użytkownik zalogowany. Ten nowy jest przechowywane w ramach projektu Firebase i może służyć do identyfikowania użytkownika w każdej aplikacji w projekcie, niezależnie od tego, jak się loguje.

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

  • W Bazie danych czasu rzeczywistego Firebase i Cloud Storage reguł zabezpieczeń, możesz pobierz ze zmiennej auth unikalny identyfikator zalogowanego użytkownika, i używać ich do kontrolowania, do jakich danych użytkownik ma dostęp.

Możesz zezwolić użytkownikom na logowanie się w aplikacji przy użyciu wielokrotnego uwierzytelniania. dostawców, łącząc dane logowania dostawcy uwierzytelniania z istniejącego konta użytkownika.

Aby wylogować użytkownika, wywołaj 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żna także dodać kod obsługi błędów dla pełnego zakresu uwierzytelniania . Patrz sekcja Obsługa błędów.