Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

iOS'ta Google ile Oturum Açmayı Kullanarak Kimlik Doğrulama

Google Sign-In'i uygulamanıza entegre ederek, kullanıcılarınızın Google Hesaplarını kullanarak Firebase ile kimlik doğrulamasını sağlayabilirsiniz.

Sen başlamadan önce

  1. İOS projeye Firebase ekleyin . Senin şu bakla ekleyin Podfile :
    pod 'Firebase/Auth'
    pod 'GoogleSignIn'
    
  2. Henüz Firebase projesine uygulamanızı bağlı değil varsa, gelen bunu Firebase konsoluna .
  3. Firebase konsolunda Google ile Oturum Açmayı etkinleştirin:
    1. In Firebase konsoluna , Auth bölümünü açın.
    2. Yöntem sekmede yap, Google oturum açma yöntemine etkinleştirmek 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 Firebase
import GoogleSignIn

Amaç-C

@import Firebase;
@import GoogleSignIn;

2. Google Sign-In'i uygulayın

Bu adımları izleyerek Google Sign-In'i uygulayın. Bkz Google Sign-In geliştirici belgelerine iOS Google Oturum Açma özelliğini kullanarak ilgili ayrıntılar için.

  1. Xcode projenize özel URL şemaları ekleyin:
    1. Proje konfigürasyonunuzu açın: sol ağaç görünümünde proje adına çift tıklayın. Daha sonra, HEDEF bölümünden uygulamanızı seçin Bilgi sekmesini seçin ve URL Türleri bölümünü genişletin.
    2. + Düğmesine tıklayın ve ters müşteri kimliği için bir URL şemasını ekleyin. Bu değeri bulmak için, açmak GoogleService-Info.plist yapılandırma dosyasını ve için göz REVERSED_CLIENT_ID tuşu. Bu anahtarın değerini kopyalayın ve Şemaları yapılandırma sayfasında kutusu URL'ye 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):

  2. Uygulama temsilcinizin yılında application:didFinishLaunchingWithOptions: yöntemi yapılandırmak FirebaseApp nesnesi.

    Süratli

    // Use Firebase library to configure APIs
    FirebaseApp.configure()
    

    Amaç-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
    
  3. Uygulamak application:openURL:options: uygulama temsilcinize yöntemi. Yöntem çağırmalıdır handleURL yöntemini GIDSignIn düzgün uygulamaya kimlik doğrulama işleminin sonunda aldığı URL'yi idare edecek Örneğin,.

    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];
    }
    
  4. 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 {
        // ...
      }
    }];
    
    
  5. Bir ekleme GIDSignInButton Storyboard'unuza, XIB dosyaya veya programlı örnekleriz. Storyboard'unuza veya XIB dosyasına düğmesini eklemek için, Görünüm ekleyebilir ve kendi özel sınıfını ayarlamak GIDSignInButton .
  6. İsteğe bağlı: düğmeyi özelleştirmek istiyorsanız, aşağıdakileri yapın:

    Süratli

    1. Görünüm denetleyicinizde, oturum açma düğmesini bir özellik olarak bildirin.
      @IBOutlet weak var signInButton: GIDSignInButton!
    2. İçin düğmeye bağlayın signInButton sadece bildirilen bir özelliği.
    3. Özelliklerini ayarlayarak düğmeye özelleştirme GIDSignInButton nesne.

    Amaç-C

    1. 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;
    2. İçin düğmeye bağlayın signInButton sadece bildirilen bir özelliği.
    3. Özelliklerini ayarlayarak düğmeye özelleştirme GIDSignInButton nesne.

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 kimlik doğrulama sağlayıcısı bilgileri gibi kimlik bilgilerine bağlanır. 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.

  • Senin uygulamalarda, gelen kullanıcının temel profil bilgileri alabilirsiniz FIRUser nesnesi. Bkz Kullanıcıları Yönetme .

  • Senin Firebase Gerçek Zamanlı Veritabanı ve Bulut Depolama yılında Güvenlik Kuralları , alabilirsiniz, kullanıcının benzersiz bir kullanıcı kimliği imzalı auth değişkeni ve hangi verilerin kullanıcı teneke erişimi kontrol etmek için kullanabilirsiniz.

Kullanıcıların birden çok kimlik doğrulama sağlayıcıları kullanarak uygulamada oturum izin verebilir mevcut bir kullanıcı hesabına auth sağlayıcı kimlik bilgilerini birbirine bağlayan.

Bir kullanıcı Oturumu kapatmak için çağrı 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. Bkz Sap Hataları .