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.
- W Xcode, przy otwartym projekcie aplikacji, przejdź do File > Add Packages .
- Po wyświetleniu monitu dodaj repozytorium SDK platform Firebase Apple:
- Wybierz bibliotekę uwierzytelniania Firebase.
- Dodaj flagę
-ObjC
do sekcji Inne flagi linkera w ustawieniach kompilacji celu. - Po zakończeniu Xcode automatycznie rozpocznie rozwiązywanie i pobieranie zależności w tle.
https://github.com/firebase/firebase-ios-sdk.git
Dodaj pakiet SDK logowania Google do swojego projektu
W Xcode, przy otwartym projekcie aplikacji, przejdź do File > Add Packages .
Po wyświetleniu monitu dodaj repozytorium SDK logowania Google:
https://github.com/google/GoogleSignIn-iOS
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:
- W konsoli Firebase otwórz sekcję Uwierzytelnianie .
- Na karcie Metoda logowania włącz dostawcę Google .
Kliknij Zapisz .
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.
- Dodaj niestandardowe schematy adresów URL do swojego projektu Xcode:
- 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 .
- Kliknij przycisk + i dodaj schemat adresu URL dla odwróconego identyfikatora klienta. Aby znaleźć tę wartość, otwórz plik konfiguracyjny
i poszukaj kluczaGoogleService-Info.plist 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):
- W metodzie
application:didFinishLaunchingWithOptions:
delegata aplikacji skonfiguruj obiektFirebaseApp
.Szybki
FirebaseApp.configure()
Cel C
// Use Firebase library to configure APIs [FIRApp configure];
- Zaimplementuj
application:openURL:options:
delegata aplikacji. Metoda powinna wywołać metodęhandleURL
instancjiGIDSignIn
, 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]; }
- 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 { // ... } }];
- 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ą naGIDSignInButton
. - Opcjonalnie : jeśli chcesz dostosować przycisk, wykonaj następujące czynności:
Szybki
- W kontrolerze widoku zadeklaruj przycisk logowania jako właściwość.
@IBOutlet weak var signInButton: GIDSignInButton!
- Połącz przycisk z
signInButton
właśnie właściwościąsignInButton. - Dostosuj przycisk, ustawiając właściwości obiektu GIDsignInButton .
Cel C
- W pliku nagłówkowym kontrolera widoku zadeklaruj przycisk logowania jako właściwość.
@property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton;
- Połącz przycisk z
signInButton
właśnie właściwościąsignInButton. - Dostosuj przycisk, ustawiając właściwości obiektu GIDsignInButton .
- W kontrolerze widoku zadeklaruj przycisk logowania jako właściwość.
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 .