Anda dapat mengizinkan pengguna mengautentikasi dengan Firebase menggunakan Akun Google mereka dengan mengintegrasikan Login dengan Google ke aplikasi Anda.
Sebelum kamu memulai
- Tambahkan Firebase ke proyek Apple Anda . Sertakan pod berikut di
Podfile
Anda: l10npod 'FirebaseAuth' pod 'GoogleSignIn'
- Jika Anda belum menghubungkan aplikasi ke proyek Firebase, lakukan dari konsol Firebase .
- Aktifkan Google sebagai metode masuk di konsol Firebase:
- Di konsol Firebase , buka bagian Auth .
- Pada tab Metode masuk , aktifkan metode masuk Google dan klik Simpan .
1. Impor file header yang diperlukan
Pertama, Anda harus mengimpor file header Firebase SDK dan Google Sign-In SDK ke aplikasi Anda.
Cepat
import FirebaseCore import GoogleSignIn
Objective-C
@import FirebaseCore; @import GoogleSignIn;
2. Terapkan Masuk dengan Google
Terapkan Masuk dengan Google dengan mengikuti langkah-langkah berikut. Lihat dokumentasi developer Login dengan Google untuk mengetahui detail tentang cara menggunakan Login dengan Google dengan iOS.
- Tambahkan skema URL khusus ke proyek Xcode Anda:
- Buka konfigurasi proyek Anda: klik dua kali nama proyek di tampilan struktur pohon sebelah kiri. Pilih aplikasi Anda dari bagian TARGET , lalu pilih tab Info , dan luaskan bagian Jenis URL .
- Klik tombol + , dan tambahkan skema URL untuk ID klien terbalik Anda. Untuk menemukan nilai ini, buka file konfigurasi
, dan cari kunciGoogleService-Info.plist REVERSED_CLIENT_ID
. Salin nilai kunci itu, dan tempelkan ke kotak Skema URL di halaman konfigurasi. Biarkan kolom lainnya kosong.Setelah selesai, konfigurasi Anda akan terlihat seperti berikut ini (tetapi dengan nilai khusus aplikasi Anda):
- Dalam metode
application:didFinishLaunchingWithOptions:
, konfigurasikan objekFirebaseApp
.Cepat
// Use Firebase library to configure APIs FirebaseApp.configure()
Objective-C
// Use Firebase library to configure APIs [FIRApp configure];
- Terapkan
application:openURL:options:
metode delegasi aplikasi Anda. Metode tersebut harus memanggil metodehandleURL
dari instanceGIDSignIn
, yang akan menangani dengan benar URL yang diterima aplikasi Anda di akhir proses autentikasi.Cepat
@available(iOS 9.0, *) func application(_ application: 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]; }
- Teruskan pengontrol tampilan penyajian dan ID klien untuk aplikasi Anda ke metode masuk Google Sign In dan buat kredensial autentikasi Firebase dari token autentikasi Google yang dihasilkan:
Cepat
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) // ... }
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 { // ... } }];
- Tambahkan
GIDSignInButton
ke storyboard Anda, file XIB, atau instantiate secara terprogram. Untuk menambahkan tombol ke papan cerita atau file XIB Anda, tambahkan Tampilan dan setel kelas khusus keGIDSignInButton
. - Opsional : Jika Anda ingin menyesuaikan tombol, lakukan hal berikut:
Cepat
- Di pengontrol tampilan Anda, nyatakan tombol masuk sebagai properti.
@IBOutlet weak var signInButton: GIDSignInButton!
- Hubungkan tombol ke properti
signInButton
yang baru saja Anda nyatakan. - Sesuaikan tombol dengan menyetel properti objek GIDSignInButton .
Objective-C
- Di file header pengontrol tampilan Anda, nyatakan tombol masuk sebagai properti.
@property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton;
- Hubungkan tombol ke properti
signInButton
yang baru saja Anda nyatakan. - Sesuaikan tombol dengan menyetel properti objek GIDSignInButton .
- Di pengontrol tampilan Anda, nyatakan tombol masuk sebagai properti.
3. Otentikasi dengan Firebase
Terakhir, selesaikan proses login Firebase dengan kredensial autentikasi yang dibuat di langkah sebelumnya.
Cepat
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 // ... }
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; // ... }];
Langkah selanjutnya
Setelah pengguna masuk untuk pertama kali, akun pengguna baru dibuat dan ditautkan ke kredensial—yaitu, nama pengguna dan sandi, nomor telepon, atau informasi penyedia autentikasi—yang digunakan pengguna untuk masuk. Akun baru ini disimpan sebagai bagian dari project Firebase Anda, dan dapat digunakan untuk mengidentifikasi pengguna di setiap aplikasi dalam project Anda, terlepas dari cara pengguna login.
Di aplikasi Anda, Anda bisa mendapatkan informasi profil dasar pengguna dari objek
User
. Lihat Kelola Pengguna .Dalam Aturan Keamanan Firebase Realtime Database dan Cloud Storage, Anda bisa mendapatkan ID pengguna unik pengguna yang masuk dari variabel
auth
, dan menggunakannya untuk mengontrol data apa yang dapat diakses pengguna.
Anda dapat mengizinkan pengguna masuk ke aplikasi Anda menggunakan beberapa penyedia autentikasi dengan menautkan kredensial penyedia autentikasi ke akun pengguna yang ada.
Untuk mengeluarkan pengguna, panggil signOut:
.
Cepat
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; }
Anda mungkin juga ingin menambahkan kode penanganan kesalahan untuk berbagai kesalahan autentikasi. Lihat Menangani Kesalahan .