Możesz umożliwić użytkownikom uwierzytelnianie się w Firebase przy użyciu ich kont Google, integrując logowanie Google z swoją aplikacją.
Zanim zaczniesz
Do instalacji zależności Firebase i zarządzania nimi możesz używać menedżera pakietów Swift.
- Po otwarciu projektu aplikacji w Xcode wybierz Plik > Dodaj pakiety.
- Gdy pojawi się prośba, dodaj repozytorium pakietu SDK Firebase na platformy Apple:
- Wybierz bibliotekę Firebase Authentication.
- Dodaj flagę
-ObjC
do sekcji Inne flagi linkera w ustawieniach kompilacji docelowej. - Gdy to zrobisz, Xcode automatycznie zacznie wyszukiwać i pobierać zależności w tle.
https://github.com/firebase/firebase-ios-sdk.git
Dodawanie do projektu pakietu SDK logowania w Google
Po otwarciu projektu aplikacji w Xcode wybierz Plik > Dodaj pakiety.
Gdy pojawi się odpowiedni komunikat, dodaj repozytorium pakietu SDK logowania Google:
https://github.com/google/GoogleSignIn-iOS
Gdy to zrobisz, Xcode automatycznie zacznie wyszukiwać i pobierać zależności w tle.
Włącz logowanie przez Google w projekcie Firebase
Aby umożliwić użytkownikom logowanie się za pomocą usługi Logowanie przez Google, musisz najpierw włączyć dostawcę Logowania przez Google w projekcie 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
projektu i przekaż go do projektu Xcode. Zastąp wszystkie istniejące wersje nową. (zobacz Dodaj Firebase do projektu na iOS).
Importowanie wymaganych plików nagłówka
Najpierw musisz zaimportować do aplikacji pliki nagłówka pakietu SDK Firebase i pakietu SDK logowania się w Google.
import FirebaseCore import FirebaseAuth import GoogleSignIn
@import FirebaseCore; @import GoogleSignIn;
Wdrożenie logowania Google
Aby wdrożyć logowanie przez Google, wykonaj te czynności. Szczegółowe informacje o używaniu funkcji Logowania w Google na urządzeniach z iOS znajdziesz w dokumentacji dla deweloperów dotyczącej Logowania w Google.
- Dodawanie niestandardowych schematów adresów URL do projektu Xcode:
- Otwórz konfigurację projektu: kliknij nazwę projektu w widoku drzewa po lewej stronie. W sekcji CELE wybierz swoją aplikację, a potem kliknij kolejno karty Informacje i Typy adresów URL.
- Kliknij przycisk + i dodaj schemat adresu URL dla odwróconego identyfikatora klienta. Aby znaleźć tę wartość, otwórz plik konfiguracji
i znajdź kluczGoogleService-Info.plist REVERSED_CLIENT_ID
. Skopiuj wartość tego klucza i wklej ją w polu Schematy URL na stronie konfiguracji. Pozostaw pozostałe pola bez zmian.Po zakończeniu konfiguracja powinna wyglądać mniej więcej tak (ale z wartościami odpowiednimi dla Twojej aplikacji):
- W metodzie
application:didFinishLaunchingWithOptions:
obiektuFirebaseApp
w delegacie aplikacji skonfiguruj obiektFirebaseApp
.FirebaseApp.configure()
// Use Firebase library to configure APIs [FIRApp configure];
- Zaimplementuj metodę
application:openURL:options:
w delegacie aplikacji. Metoda powinna wywoływać metodęhandleURL
instancjiGIDSignIn
, która odpowiednio obsłuży adres URL otrzymany przez Twoją aplikację na końcu procesu uwierzytelniania.func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { return GIDSignIn.sharedInstance.handle(url) }
- (BOOL)application:(nonnull UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<NSString *, id> *)options { return [[GIDSignIn sharedInstance] handleURL:url]; }
- Przekaż kontroler wyświetlania widoku i identyfikator klienta swojej aplikacji do metody
signIn
dostawcy logowania w Google, a następnie utwórz dane logowania Firebase na podstawie otrzymanego tokena uwierzytelniania Google: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) // ... }
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 storyboardu lub pliku XIB albo utwórz go za pomocą kodu. Aby dodać przycisk do storyboardu lub pliku XIB, dodaj widok i ustaw jego klasę niestandardową naGIDSignInButton
. - Opcjonalnie: jeśli chcesz dostosować przycisk, wykonaj te czynności:
- W kontrolerze widoku zadeklaruj przycisk logowania jako właściwość.
@IBOutlet weak var signInButton: GIDSignInButton!
- Połącz przycisk z usługą
signInButton
, którą właśnie zadeklarowałeś/zadeklarowałaś. - Dostosuj przycisk, ustawiając właściwości obiektu GIDSignInButton.
- W pliku nagłówka kontrolera widoku zadeklaruj przycisk logowania jako właściwość.
@property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton;
- Połącz przycisk z usługą
signInButton
, którą właśnie zadeklarowałeś/zadeklarowałaś. - Dostosuj przycisk, ustawiając właściwości obiektu GIDSignInButton.
- W kontrolerze widoku zadeklaruj przycisk logowania jako właściwość.
Uwierzytelnienie za pomocą Firebase
Na koniec ukończ proces logowania w Firebase, używając danych logowania utworzonych w poprzednim kroku.
Auth.auth().signIn(with: credential) { result, error in // At this point, our user is signed in }
[[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, zostanie utworzone nowe konto użytkownika i połączone z danymi logowania, czyli nazwą użytkownika i hasłem, numerem telefonu lub informacjami dostawcy uwierzytelniania. To nowe konto jest przechowywane w projekcie Firebase i może służyć do identyfikowania użytkownika we wszystkich aplikacjach w projekcie, niezależnie od tego, jak użytkownik się loguje.
-
W swoich aplikacjach możesz pobrać podstawowe informacje o profilu użytkownika z obiektu
User
. Zobacz Zarządzanie użytkownikami. W regułach Firebase Realtime Database i Cloud Storage Regułach bezpieczeństwa możesz pobrać z zmiennej
auth
unikalny identyfikator zalogowanego użytkownika i użyć go do kontrolowania dostępu użytkownika do danych.
Możesz zezwolić użytkownikom na logowanie się w aplikacji za pomocą danych logowania od wielu dostawców uwierzytelniania, połączając je z dotychczasowym kontem użytkownika.
Aby wylogować użytkownika, zadzwoń pod numer
signOut:
.
let firebaseAuth = Auth.auth() do { try firebaseAuth.signOut() } catch let signOutError as NSError { print("Error signing out: %@", signOutError) }
NSError *signOutError; BOOL status = [[FIRAuth auth] signOut:&signOutError]; if (!status) { NSLog(@"Error signing out: %@", signOutError); return; }
Możesz też dodać kod do obsługi błędów w całym zakresie błędów uwierzytelniania. Zobacz Obsługa błędów.