Authentifizieren Sie sich mit der Google-Anmeldung auf Apple-Plattformen

Sie können Ihren Benutzern ermöglichen, sich mit ihren Google-Konten bei Firebase zu authentifizieren, indem Sie die Google-Anmeldung in Ihre App integrieren.

Bevor Sie beginnen

  1. Fügen Sie Ihrem Apple-Projekt Firebase hinzu . Fügen Sie die folgenden Pods in Ihre Podfile :
    pod 'FirebaseAuth'
    pod 'GoogleSignIn'
    
  2. Wenn Sie Ihre App noch nicht mit Ihrem Firebase-Projekt verbunden haben, tun Sie dies über die Firebase-Konsole .
  3. Aktivieren Sie Google als Anmeldemethode in der Firebase-Konsole:
    1. Öffnen Sie in der Firebase-Konsole den Abschnitt Auth .
    2. Aktivieren Sie auf der Registerkarte Anmeldemethode die Google -Anmeldemethode und klicken Sie auf Speichern .

1. Importieren Sie die erforderlichen Header-Dateien

Zunächst müssen Sie die Header-Dateien des Firebase SDK und des Google Sign-In SDK in Ihre App importieren.

Schnell

import FirebaseCore
import GoogleSignIn

Ziel c

@import FirebaseCore;
@import GoogleSignIn;

2. Implementieren Sie die Google-Anmeldung

Implementieren Sie die Google-Anmeldung, indem Sie diesen Schritten folgen. Weitere Informationen zur Verwendung von Google Sign-in mit iOS finden Sie in der Google Sign-in-Entwicklerdokumentation .

  1. Fügen Sie Ihrem Xcode-Projekt benutzerdefinierte URL-Schemata hinzu:
    1. Öffnen Sie Ihre Projektkonfiguration: Doppelklicken Sie in der linken Baumansicht auf den Projektnamen. Wählen Sie Ihre App aus dem Abschnitt ZIELE aus, wählen Sie dann die Registerkarte Info und erweitern Sie den Abschnitt URL-Typen .
    2. Klicken Sie auf die Schaltfläche + und fügen Sie ein URL-Schema für Ihre umgekehrte Client-ID hinzu. Um diesen Wert zu finden, öffnen Sie die Konfigurationsdatei GoogleService-Info.plist und suchen Sie nach dem Schlüssel REVERSED_CLIENT_ID . Kopieren Sie den Wert dieses Schlüssels und fügen Sie ihn in das Feld URL-Schemata auf der Konfigurationsseite ein. Lassen Sie die anderen Felder leer.

      Wenn Sie fertig sind, sollte Ihre Konfiguration ungefähr so ​​aussehen (aber mit Ihren anwendungsspezifischen Werten):

  2. Konfigurieren Sie in der Methode application:didFinishLaunchingWithOptions: Ihres App-Delegaten das FirebaseApp -Objekt.

    Schnell

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

    Ziel c

    // Use Firebase library to configure APIs
    [FIRApp configure];
    
  3. Implementieren Sie die Methode application:openURL:options: Ihres App-Delegaten. Die Methode sollte die handleURL Methode der GIDSignIn Instanz aufrufen, die die URL, die Ihre Anwendung am Ende des Authentifizierungsprozesses erhält, ordnungsgemäß verarbeitet.

    Schnell

    @available(iOS 9.0, *)
    func application(_ application: UIApplication, open url: URL,
                     options: [UIApplication.OpenURLOptionsKey: Any])
      -> Bool {
      return GIDSignIn.sharedInstance.handle(url)
    }
    

    Ziel c

    - (BOOL)application:(nonnull UIApplication *)application
                openURL:(nonnull NSURL *)url
                options:(nonnull NSDictionary<NSString *, id> *)options {
      return [[GIDSignIn sharedInstance] handleURL:url];
    }
    
  4. Übergeben Sie den präsentierenden View-Controller und die Client-ID für Ihre App an die Anmeldemethode von Google Sign In und erstellen Sie aus dem resultierenden Google-Authentifizierungstoken einen Firebase-Authentifizierungsnachweis:

    Schnell

    guard let clientID = FirebaseApp.app()?.options.clientID else { return }
    
    // Create Google Sign In configuration object.
    let config = GIDConfiguration(clientID: clientID)
    
    // Start the sign in flow!
    GIDSignIn.sharedInstance.signIn(with: config, presenting: self) { [unowned self] user, error in
    
      if let error = error {
        // ...
        return
      }
    
      guard
        let authentication = user?.authentication,
        let idToken = authentication.idToken
      else {
        return
      }
    
      let credential = GoogleAuthProvider.credential(withIDToken: idToken,
                                                     accessToken: authentication.accessToken)
    
      // ...
    }
    

    Ziel c

    GIDConfiguration *config = [[GIDConfiguration alloc] initWithClientID:[FIRApp defaultApp].options.clientID];
    
    __weak __auto_type weakSelf = self;
    [GIDSignIn.sharedInstance signInWithConfiguration:config presentingViewController:self callback:^(GIDGoogleUser * _Nullable user, NSError * _Nullable error) {
      __auto_type strongSelf = weakSelf;
      if (strongSelf == nil) { return; }
    
      if (error == nil) {
        GIDAuthentication *authentication = user.authentication;
        FIRAuthCredential *credential =
        [FIRGoogleAuthProvider credentialWithIDToken:authentication.idToken
                                         accessToken:authentication.accessToken];
        // ...
      } else {
        // ...
      }
    }];
    
    
  5. Fügen Sie Ihrem Storyboard oder Ihrer XIB-Datei einen GIDSignInButton oder instanziieren Sie ihn programmgesteuert. Um die Schaltfläche zu Ihrem Storyboard oder Ihrer XIB-Datei hinzuzufügen, fügen Sie eine Ansicht hinzu und legen Sie ihre benutzerdefinierte Klasse auf GIDSignInButton .
  6. Optional : Wenn Sie die Schaltfläche anpassen möchten, gehen Sie wie folgt vor:

    Schnell

    1. Deklarieren Sie in Ihrem View-Controller die Anmeldeschaltfläche als Eigenschaft.
      @IBOutlet weak var signInButton: GIDSignInButton!
    2. Verbinden Sie die Schaltfläche mit der Eigenschaft signInButton , die Sie gerade deklariert haben.
    3. Passen Sie die Schaltfläche an, indem Sie die Eigenschaften des GIDSignInButton- Objekts festlegen.

    Ziel c

    1. Deklarieren Sie in der Header-Datei Ihres View-Controllers die Anmeldeschaltfläche als Eigenschaft.
      @property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton;
    2. Verbinden Sie die Schaltfläche mit der Eigenschaft signInButton , die Sie gerade deklariert haben.
    3. Passen Sie die Schaltfläche an, indem Sie die Eigenschaften des GIDSignInButton- Objekts festlegen.

3. Authentifizieren Sie sich bei Firebase

Schließen Sie abschließend den Firebase-Anmeldevorgang mit den im vorherigen Schritt erstellten Authentifizierungsdaten ab.

Schnell

Auth.auth().signIn(with: credential) { authResult, error in
    if let error = error {
      let authError = error as NSError
      if isMFAEnabled, authError.code == AuthErrorCode.secondFactorRequired.rawValue {
        // The user is a multi-factor user. Second factor challenge is required.
        let resolver = authError
          .userInfo[AuthErrorUserInfoMultiFactorResolverKey] as! MultiFactorResolver
        var displayNameString = ""
        for tmpFactorInfo in resolver.hints {
          displayNameString += tmpFactorInfo.displayName ?? ""
          displayNameString += " "
        }
        self.showTextInputPrompt(
          withMessage: "Select factor to sign in\n\(displayNameString)",
          completionBlock: { userPressedOK, displayName in
            var selectedHint: PhoneMultiFactorInfo?
            for tmpFactorInfo in resolver.hints {
              if displayName == tmpFactorInfo.displayName {
                selectedHint = tmpFactorInfo as? PhoneMultiFactorInfo
              }
            }
            PhoneAuthProvider.provider()
              .verifyPhoneNumber(with: selectedHint!, uiDelegate: nil,
                                 multiFactorSession: resolver
                                   .session) { verificationID, error in
                if error != nil {
                  print(
                    "Multi factor start sign in failed. Error: \(error.debugDescription)"
                  )
                } else {
                  self.showTextInputPrompt(
                    withMessage: "Verification code for \(selectedHint?.displayName ?? "")",
                    completionBlock: { userPressedOK, verificationCode in
                      let credential: PhoneAuthCredential? = PhoneAuthProvider.provider()
                        .credential(withVerificationID: verificationID!,
                                    verificationCode: verificationCode!)
                      let assertion: MultiFactorAssertion? = PhoneMultiFactorGenerator
                        .assertion(with: credential!)
                      resolver.resolveSignIn(with: assertion!) { authResult, error in
                        if error != nil {
                          print(
                            "Multi factor finanlize sign in failed. Error: \(error.debugDescription)"
                          )
                        } else {
                          self.navigationController?.popViewController(animated: true)
                        }
                      }
                    }
                  )
                }
              }
          }
        )
      } else {
        self.showMessagePrompt(error.localizedDescription)
        return
      }
      // ...
      return
    }
    // User is signed in
    // ...
}

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

Nächste Schritte

Nachdem sich ein Benutzer zum ersten Mal angemeldet hat, wird ein neues Benutzerkonto erstellt und mit den Anmeldeinformationen verknüpft – d. h. dem Benutzernamen und Kennwort, der Telefonnummer oder den Authentifizierungsanbieterinformationen –, mit denen sich der Benutzer angemeldet hat. Dieses neue Konto wird als Teil Ihres Firebase-Projekts gespeichert und kann verwendet werden, um einen Benutzer in jeder App in Ihrem Projekt zu identifizieren, unabhängig davon, wie sich der Benutzer anmeldet.

  • In Ihren Apps können Sie die grundlegenden Profilinformationen des Benutzers aus dem FIRUser Objekt abrufen. Siehe Benutzer verwalten .

  • In Ihren Sicherheitsregeln für die Firebase-Echtzeitdatenbank und den Cloud-Speicher können Sie die eindeutige Benutzer-ID des angemeldeten Benutzers aus der Variablen auth und damit steuern, auf welche Daten ein Benutzer zugreifen kann.

Sie können Benutzern erlauben, sich mit mehreren Authentifizierungsanbietern bei Ihrer App anzumelden, indem Sie die Anmeldeinformationen des Authentifizierungsanbieters mit einem vorhandenen Benutzerkonto verknüpfen.

Um einen Benutzer abzumelden, rufen signOut: .

Schnell

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

Ziel c

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

Möglicherweise möchten Sie auch Fehlerbehandlungscode für alle Authentifizierungsfehler hinzufügen. Siehe Behandlung von Fehlern .