Google Sign-In'i uygulamanıza entegre ederek, kullanıcılarınızın Google Hesaplarını kullanarak Firebase ile kimlik doğrulaması yapmasına izin verebilirsiniz.
Sen başlamadan önce
- Apple projenize Firebase ekleyin . Pod dosyanıza aşağıdaki bölmeleri ekleyin:
Podfile
pod 'FirebaseAuth' pod 'GoogleSignIn'
- Uygulamanızı henüz Firebase projenize bağlamadıysanız, bunu Firebase konsolundan yapın.
- Google'ı Firebase konsolunda oturum açma yöntemi olarak etkinleştirin:
- Firebase konsolunda , Yetkilendirme bölümünü açın.
- Oturum açma yöntemi sekmesinde, Google oturum açma yöntemini etkinleştirin ve Kaydet 'i tıklayın.
1. Gerekli başlık dosyalarını içe aktarın
İlk olarak, Firebase SDK ve Google Sign-In SDK başlık dosyalarını uygulamanıza aktarmanız gerekir.
Süratli
import FirebaseCore import GoogleSignIn
Amaç-C
@import FirebaseCore; @import GoogleSignIn;
2. Google Sign-In'i uygulayın
Bu adımları izleyerek Google Sign-In'i uygulayın. iOS ile Google ile Oturum Açmayı kullanmayla ilgili ayrıntılar için Google Oturum Açma geliştirici belgelerine bakın.
- Xcode projenize özel URL şemaları ekleyin:
- Proje konfigürasyonunuzu açın: sol ağaç görünümünde proje adına çift tıklayın. HEDEFLER bölümünden uygulamanızı seçin, ardından Bilgi sekmesini seçin ve URL Türleri bölümünü genişletin.
- + düğmesini tıklayın ve tersine çevrilmiş müşteri kimliğiniz için bir URL şeması ekleyin. Bu değeri bulmak için
yapılandırma dosyasını açın veGoogleService-Info.plist REVERSED_CLIENT_ID
anahtarını arayın. Bu anahtarın değerini kopyalayın ve yapılandırma sayfasındaki URL Şemaları kutusuna yapıştırın. Diğer alanları boş bırakın.Tamamlandığında, yapılandırmanız aşağıdakine benzer görünmelidir (ancak uygulamaya özel değerlerinizle):
- Uygulama temsilcinizin
application:didFinishLaunchingWithOptions:
yöntemindeFirebaseApp
nesnesini yapılandırın.Süratli
// Use Firebase library to configure APIs FirebaseApp.configure()
Amaç-C
// Use Firebase library to configure APIs [FIRApp configure];
- Uygulama temsilcinizin
application:openURL:options:
yöntemini uygulayın. Yöntem, kimlik doğrulama işleminin sonunda uygulamanızın aldığı URL'yi düzgün bir şekilde işleyecek olanGIDSignIn
örneğininhandleURL
yöntemini çağırmalıdır.Süratli
@available(iOS 9.0, *) func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any]) -> Bool { return GIDSignIn.sharedInstance.handle(url) }
Amaç-C
- (BOOL)application:(nonnull UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<NSString *, id> *)options { return [[GIDSignIn sharedInstance] handleURL:url]; }
- Uygulamanız için sunum görünümü denetleyicisini ve istemci kimliğini Google Sign In oturum açma yöntemine iletin ve elde edilen Google auth belirtecinden bir Firebase auth kimlik bilgisi oluşturun:
Süratli
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) // ... }
Amaç-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 { // ... } }];
- Film şeridinize, XIB dosyanıza bir
GIDSignInButton
ekleyin veya programlı olarak somutlaştırın. Düğmeyi film şeridinize veya XIB dosyanıza eklemek için bir Görünüm ekleyin ve özel sınıfınıGIDSignInButton
olarak ayarlayın. - İsteğe bağlı : Düğmeyi özelleştirmek istiyorsanız aşağıdakileri yapın:
Süratli
- Görünüm denetleyicinizde, oturum açma düğmesini bir özellik olarak bildirin.
@IBOutlet weak var signInButton: GIDSignInButton!
- Düğmeyi, az önce bildirdiğiniz
signInButton
özelliğine bağlayın. - GIDSignInButton nesnesinin özelliklerini ayarlayarak düğmeyi özelleştirin.
Amaç-C
- Görünüm denetleyicinizin başlık dosyasında, oturum açma düğmesini bir özellik olarak bildirin.
@property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton;
- Düğmeyi, az önce bildirdiğiniz
signInButton
özelliğine bağlayın. - GIDSignInButton nesnesinin özelliklerini ayarlayarak düğmeyi özelleştirin.
- Görünüm denetleyicinizde, oturum açma düğmesini bir özellik olarak bildirin.
3. Firebase ile kimlik doğrulaması yapın
Son olarak, önceki adımda oluşturulan kimlik doğrulama bilgileriyle Firebase oturum açma işlemini tamamlayın.
Süratli
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 // ... }
Amaç-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; // ... }];
Sonraki adımlar
Bir kullanıcı ilk kez oturum açtıktan sonra, yeni bir kullanıcı hesabı oluşturulur ve oturum açtığı kullanıcı adı ve parolası, telefon numarası veya yetkilendirme sağlayıcı bilgileri gibi kimlik bilgileriyle ilişkilendirilir. Bu yeni hesap, Firebase projenizin bir parçası olarak depolanır ve kullanıcının nasıl oturum açtığından bağımsız olarak projenizdeki her uygulamada bir kullanıcıyı tanımlamak için kullanılabilir.
Uygulamalarınızda, kullanıcının temel profil bilgilerini
FIRUser
nesnesinden alabilirsiniz. Kullanıcıları Yönetme konusuna bakın.Firebase Gerçek Zamanlı Veritabanınız ve Bulut Depolama Güvenlik Kurallarınızda , oturum açmış kullanıcının benzersiz kullanıcı kimliğini
auth
değişkeninden alabilir ve bunu bir kullanıcının hangi verilere erişebileceğini kontrol etmek için kullanabilirsiniz.
Bir kullanıcının oturumunu kapatmak için, signOut:
.
Süratli
let firebaseAuth = Auth.auth() do { try firebaseAuth.signOut() } catch let signOutError as NSError { print("Error signing out: %@", signOutError) }
Amaç-C
NSError *signOutError; BOOL status = [[FIRAuth auth] signOut:&signOutError]; if (!status) { NSLog(@"Error signing out: %@", signOutError); return; }
Ayrıca, tüm kimlik doğrulama hataları için hata işleme kodu eklemek isteyebilirsiniz. Hataları İşleme konusuna bakın.
,Google Sign-In'i uygulamanıza entegre ederek, kullanıcılarınızın Google Hesaplarını kullanarak Firebase ile kimlik doğrulaması yapmasına izin verebilirsiniz.
Sen başlamadan önce
- Apple projenize Firebase ekleyin . Pod dosyanıza aşağıdaki bölmeleri ekleyin:
Podfile
pod 'FirebaseAuth' pod 'GoogleSignIn'
- Uygulamanızı henüz Firebase projenize bağlamadıysanız, bunu Firebase konsolundan yapın.
- Google'ı Firebase konsolunda oturum açma yöntemi olarak etkinleştirin:
- Firebase konsolunda , Yetkilendirme bölümünü açın.
- Oturum açma yöntemi sekmesinde, Google oturum açma yöntemini etkinleştirin ve Kaydet 'i tıklayın.
1. Gerekli başlık dosyalarını içe aktarın
İlk olarak, Firebase SDK ve Google Sign-In SDK başlık dosyalarını uygulamanıza aktarmanız gerekir.
Süratli
import FirebaseCore import GoogleSignIn
Amaç-C
@import FirebaseCore; @import GoogleSignIn;
2. Google Sign-In'i uygulayın
Bu adımları izleyerek Google Sign-In'i uygulayın. iOS ile Google ile Oturum Açmayı kullanmayla ilgili ayrıntılar için Google Oturum Açma geliştirici belgelerine bakın.
- Xcode projenize özel URL şemaları ekleyin:
- Proje konfigürasyonunuzu açın: sol ağaç görünümünde proje adına çift tıklayın. HEDEFLER bölümünden uygulamanızı seçin, ardından Bilgi sekmesini seçin ve URL Türleri bölümünü genişletin.
- + düğmesini tıklayın ve tersine çevrilmiş müşteri kimliğiniz için bir URL şeması ekleyin. Bu değeri bulmak için
yapılandırma dosyasını açın veGoogleService-Info.plist REVERSED_CLIENT_ID
anahtarını arayın. Bu anahtarın değerini kopyalayın ve yapılandırma sayfasındaki URL Şemaları kutusuna yapıştırın. Diğer alanları boş bırakın.Tamamlandığında, yapılandırmanız aşağıdakine benzer görünmelidir (ancak uygulamaya özel değerlerinizle):
- Uygulama temsilcinizin
application:didFinishLaunchingWithOptions:
yöntemindeFirebaseApp
nesnesini yapılandırın.Süratli
// Use Firebase library to configure APIs FirebaseApp.configure()
Amaç-C
// Use Firebase library to configure APIs [FIRApp configure];
- Uygulama temsilcinizin
application:openURL:options:
yöntemini uygulayın. Yöntem, kimlik doğrulama işleminin sonunda uygulamanızın aldığı URL'yi düzgün bir şekilde işleyecek olanGIDSignIn
örneğininhandleURL
yöntemini çağırmalıdır.Süratli
@available(iOS 9.0, *) func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any]) -> Bool { return GIDSignIn.sharedInstance.handle(url) }
Amaç-C
- (BOOL)application:(nonnull UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<NSString *, id> *)options { return [[GIDSignIn sharedInstance] handleURL:url]; }
- Uygulamanız için sunum görünümü denetleyicisini ve istemci kimliğini Google Sign In oturum açma yöntemine iletin ve elde edilen Google auth belirtecinden bir Firebase auth kimlik bilgisi oluşturun:
Süratli
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) // ... }
Amaç-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 { // ... } }];
- Film şeridinize, XIB dosyanıza bir
GIDSignInButton
ekleyin veya programlı olarak somutlaştırın. Düğmeyi film şeridinize veya XIB dosyanıza eklemek için bir Görünüm ekleyin ve özel sınıfınıGIDSignInButton
olarak ayarlayın. - İsteğe bağlı : Düğmeyi özelleştirmek istiyorsanız aşağıdakileri yapın:
Süratli
- Görünüm denetleyicinizde, oturum açma düğmesini bir özellik olarak bildirin.
@IBOutlet weak var signInButton: GIDSignInButton!
- Düğmeyi, az önce bildirdiğiniz
signInButton
özelliğine bağlayın. - GIDSignInButton nesnesinin özelliklerini ayarlayarak düğmeyi özelleştirin.
Amaç-C
- Görünüm denetleyicinizin başlık dosyasında, oturum açma düğmesini bir özellik olarak bildirin.
@property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton;
- Düğmeyi, az önce bildirdiğiniz
signInButton
özelliğine bağlayın. - GIDSignInButton nesnesinin özelliklerini ayarlayarak düğmeyi özelleştirin.
- Görünüm denetleyicinizde, oturum açma düğmesini bir özellik olarak bildirin.
3. Firebase ile kimlik doğrulaması yapın
Son olarak, önceki adımda oluşturulan kimlik doğrulama bilgileriyle Firebase oturum açma işlemini tamamlayın.
Süratli
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 // ... }
Amaç-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; // ... }];
Sonraki adımlar
Bir kullanıcı ilk kez oturum açtıktan sonra, yeni bir kullanıcı hesabı oluşturulur ve oturum açtığı kullanıcı adı ve parolası, telefon numarası veya yetkilendirme sağlayıcı bilgileri gibi kimlik bilgileriyle ilişkilendirilir. Bu yeni hesap, Firebase projenizin bir parçası olarak depolanır ve kullanıcının nasıl oturum açtığından bağımsız olarak projenizdeki her uygulamada bir kullanıcıyı tanımlamak için kullanılabilir.
Uygulamalarınızda, kullanıcının temel profil bilgilerini
FIRUser
nesnesinden alabilirsiniz. Kullanıcıları Yönetme konusuna bakın.Firebase Gerçek Zamanlı Veritabanınız ve Bulut Depolama Güvenlik Kurallarınızda , oturum açmış kullanıcının benzersiz kullanıcı kimliğini
auth
değişkeninden alabilir ve bunu bir kullanıcının hangi verilere erişebileceğini kontrol etmek için kullanabilirsiniz.
Bir kullanıcının oturumunu kapatmak için, signOut:
.
Süratli
let firebaseAuth = Auth.auth() do { try firebaseAuth.signOut() } catch let signOutError as NSError { print("Error signing out: %@", signOutError) }
Amaç-C
NSError *signOutError; BOOL status = [[FIRAuth auth] signOut:&signOutError]; if (!status) { NSLog(@"Error signing out: %@", signOutError); return; }
Ayrıca, tüm kimlik doğrulama hataları için hata işleme kodu eklemek isteyebilirsiniz. Hataları İşle bölümüne bakın.