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
- Fügen Sie Ihrem Apple-Projekt Firebase hinzu . Fügen Sie die folgenden Pods in Ihre
Podfile
:pod 'FirebaseAuth' pod 'GoogleSignIn'
- Wenn Sie Ihre App noch nicht mit Ihrem Firebase-Projekt verbunden haben, tun Sie dies über die Firebase-Konsole .
- Aktivieren Sie Google als Anmeldemethode in der Firebase-Konsole:
- Öffnen Sie in der Firebase-Konsole den Abschnitt Auth .
- 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 .
- Fügen Sie Ihrem Xcode-Projekt benutzerdefinierte URL-Schemata hinzu:
- Ö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 .
- 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
und suchen Sie nach dem SchlüsselGoogleService-Info.plist 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):
- Konfigurieren Sie in der Methode
application:didFinishLaunchingWithOptions:
Ihres App-Delegaten dasFirebaseApp
-Objekt.Schnell
// Use Firebase library to configure APIs FirebaseApp.configure()
Ziel c
// Use Firebase library to configure APIs [FIRApp configure];
- Implementieren Sie die Methode
application:openURL:options:
Ihres App-Delegaten. Die Methode sollte diehandleURL
Methode derGIDSignIn
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]; }
- Ü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]; [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 { // ... } }];
- 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 aufGIDSignInButton
. - Optional : Wenn Sie die Schaltfläche anpassen möchten, gehen Sie wie folgt vor:
Schnell
- Deklarieren Sie in Ihrem View-Controller die Anmeldeschaltfläche als Eigenschaft.
@IBOutlet weak var signInButton: GIDSignInButton!
- Verbinden Sie die Schaltfläche mit der Eigenschaft
signInButton
, die Sie gerade deklariert haben. - Passen Sie die Schaltfläche an, indem Sie die Eigenschaften des GIDSignInButton- Objekts festlegen.
Ziel c
- Deklarieren Sie in der Header-Datei Ihres View-Controllers die Anmeldeschaltfläche als Eigenschaft.
@property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton;
- Verbinden Sie die Schaltfläche mit der Eigenschaft
signInButton
, die Sie gerade deklariert haben. - Passen Sie die Schaltfläche an, indem Sie die Eigenschaften des GIDSignInButton- Objekts festlegen.
- Deklarieren Sie in Ihrem View-Controller die Anmeldeschaltfläche als Eigenschaft.
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
User
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 .