Google is committed to advancing racial equity for Black communities. See how.
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

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

Google Oturum Açma'yı uygulamanıza entegre ederek kullanıcılarınızın Google Hesaplarını kullanarak Firebase ile kimlik doğrulamasına izin verebilirsiniz.

Sen başlamadan önce

  1. Firebase'i iOS projenize ekleyin . Pod Podfile şu kapsülleri ekleyin:
    pod 'Firebase/Auth'
    pod 'GoogleSignIn'
    
  2. Uygulamanızı henüz Firebase projenize bağlamadıysanız, bunu Firebase konsolundan yapın .
  3. Firebase konsolunda Google ile Oturum Açmayı etkinleştirin:
    1. In Firebase konsoluna , Auth bölümünü açın.
    2. 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

Öncelikle, Firebase SDK'sını ve Google Sign-In SDK başlık dosyalarını uygulamanıza aktarmanız gerekir.

Swift

Uygulama temsilcinizde aşağıdaki başlık dosyalarını içe aktarın:

import Firebase
import GoogleSignIn

Oturum açma görünümünüzün görünüm denetleyicisinde, aşağıdaki başlık dosyalarını içe aktarın:

import Firebase
import GoogleSignIn

Amaç-C

Uygulama temsilcinizde aşağıdaki başlık dosyalarını içe aktarın:

@import Firebase;
@import GoogleSignIn;

Oturum açma görünümünüzün görünüm denetleyicisinde, aşağıdaki başlık dosyalarını içe aktarın:

@import Firebase;
@import GoogleSignIn;

2. Google Oturum Açma özelliğini uygulayın

Bu adımları izleyerek Google ile Oturum Açma özelliğini uygulayın. İOS ile Google Oturum Açma kullanımıyla ilgili ayrıntılar için Google Oturum Açma geliştirici belgelerine bakın.

  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. 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.
    2. + Düğmesini tıklayın ve tersine çevrilmiş müşteri kimliğiniz için bir URL şeması ekleyin. Bu değeri bulmak için GoogleService-Info.plist yapılandırma dosyasını açın ve 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 şekilde görünmelidir (ancak uygulamaya özel değerlerinizle):

  2. Uygulama temsilcisinin GIDSignInDelegate protokolünü uyguladığını GIDSignInDelegate .

    Swift

    AppDelegate.swift :
    class AppDelegate: UIResponder, UIApplicationDelegate, GIDSignInDelegate {
    

    Amaç-C

    AppDelegate.h :
    @interface AppDelegate : UIResponder<UIApplicationDelegate, GIDSignInDelegate>
    
  3. Uygulamanızın temsilcisinin application:didFinishLaunchingWithOptions: yönteminde, FirebaseApp nesnesini yapılandırın ve oturum açma temsilcisini ayarlayın.

    Swift

    // Use Firebase library to configure APIs
    FirebaseApp.configure()
    
    GIDSignIn.sharedInstance().clientID = FirebaseApp.app()?.options.clientID
    GIDSignIn.sharedInstance().delegate = self
    

    Amaç-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
    
    [GIDSignIn sharedInstance].clientID = [FIRApp defaultApp].options.clientID;
    [GIDSignIn sharedInstance].delegate = self;
    
  4. Uygulamayı application:openURL:options: uygulama temsilcinizin yöntemi. Yöntem, kimlik doğrulama işleminin sonunda uygulamanızın aldığı URL'yi doğru bir şekilde işleyecek olan GIDSignIn örneğinin handleURL yöntemini GIDSignIn .

    Swift

    @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ın iOS 8 ve daha eski sürümlerde çalışması için, kullanımdan kaldırılan application:openURL:sourceApplication:annotation: da uygulayın application:openURL:sourceApplication:annotation: method.

    Swift

    func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
        return GIDSignIn.sharedInstance().handle(url)
    }
    

    Amaç-C

    - (BOOL)application:(UIApplication *)application
                openURL:(NSURL *)url
      sourceApplication:(NSString *)sourceApplication
             annotation:(id)annotation {
      return [[GIDSignIn sharedInstance] handleURL:url];
    }
    
  5. Uygulama temsilcisinde, aşağıdaki yöntemleri tanımlayarak oturum açma sürecini işlemek için GIDSignInDelegate protokolünü uygulayın:

    Amaç-C

    - (void)signIn:(GIDSignIn *)signIn
    didSignInForUser:(GIDGoogleUser *)user
         withError:(NSError *)error {
      // ...
      if (error == nil) {
        GIDAuthentication *authentication = user.authentication;
        FIRAuthCredential *credential =
        [FIRGoogleAuthProvider credentialWithIDToken:authentication.idToken
                                         accessToken:authentication.accessToken];
        // ...
      } else {
        // ...
      }
    }
    
    - (void)signIn:(GIDSignIn *)signIn
    didDisconnectWithUser:(GIDGoogleUser *)user
         withError:(NSError *)error {
      // Perform any operations when the user disconnects from app here.
      // ...
    }
    

    Swift

    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) {
      // ...
      if let error = error {
        // ...
        return
      }
    
      guard let authentication = user.authentication else { return }
      let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken,
                                                        accessToken: authentication.accessToken)
      // ...
    }
    
    func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!, withError error: Error!) {
        // Perform any operations when the user disconnects from app here.
        // ...
    }
    
  6. Görünüm denetleyicisinde, GIDSignIn nesnesinin sunum görünümü denetleyicisini ayarlamak ve (isteğe bağlı olarak) mümkün olduğunda sessizce oturum açmak için viewDidLoad yöntemini geçersiz GIDSignIn .

    Amaç-C

    [GIDSignIn sharedInstance].presentingViewController = self;
    [[GIDSignIn sharedInstance] signIn];
    

    Swift

    GIDSignIn.sharedInstance()?.presentingViewController = self
    GIDSignIn.sharedInstance().signIn()
    
  7. Film şeridinize, XIB dosyanıza bir GIDSignInButton ekleyin veya bunu programlı olarak başlatı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 GIDSignInButton .
  8. İsteğe bağlı : Düğmeyi özelleştirmek istiyorsanız, aşağıdakileri yapın:

    Swift

    1. Görünüm denetleyicinizde, oturum açma düğmesini bir özellik olarak bildirin.
      @IBOutlet weak var signInButton: GIDSignInButton!
    2. signInButton az önce beyan ettiğiniz signInButton özelliğine bağlayın.
    3. GIDSignInButton nesnesinin özelliklerini ayarlayarak düğmeyi özelleştirin.

    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. signInButton az önce beyan ettiğiniz signInButton özelliğine bağlayın.
    3. GIDSignInButton nesnesinin özelliklerini ayarlayarak düğmeyi özelleştirin.

3. Firebase ile kimlik doğrulayın

signIn:didSignInForUser:withError: yönteminde, GIDAuthentication nesnesinden bir Google Kimliği jetonu ve Google erişim jetonu alın ve bunları bir Firebase kimlik bilgisi ile değiştirin:

Swift

func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) {
  // ...
  if let error = error {
    // ...
    return
  }

  guard let authentication = user.authentication else { return }
  let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken,
                                                    accessToken: authentication.accessToken)
  // ...
}

Amaç-C

- (void)signIn:(GIDSignIn *)signIn
didSignInForUser:(GIDGoogleUser *)user
     withError:(NSError *)error {
  // ...
  if (error == nil) {
    GIDAuthentication *authentication = user.authentication;
    FIRAuthCredential *credential =
    [FIRGoogleAuthProvider credentialWithIDToken:authentication.idToken
                                     accessToken:authentication.accessToken];
    // ...
  } else {
    // ...
  }
}

Son olarak, kimlik bilgilerini kullanarak Firebase ile kimlik doğrulayın:

Swift

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çan kullanıcı kimlik bilgilerine (yani kullanıcı adı ve parolası, telefon numarası veya kimlik doğrulama sağlayıcı bilgileri) bağlanır. Bu yeni hesap, Firebase projenizin bir parçası olarak depolanır ve kullanıcının nasıl oturum açtığına bakılmaksızın projenizdeki her uygulamada bir kullanıcıyı tanımlamak için kullanılabilir.

  • Uygulamalarınızda, FIRUser nesnesinden kullanıcının temel profil bilgilerini FIRUser . Bkz. Kullanıcıları Yönet .

  • Firebase Realtime Database ve Cloud Storage Güvenlik Kurallarınızda , oturum açan kullanıcının benzersiz kullanıcı kimliğini auth değişkeninden alabilir ve bir kullanıcının hangi verilere erişebileceğini kontrol etmek için kullanabilirsiniz.

Kimlik doğrulama sağlayıcı kimlik bilgilerini mevcut bir kullanıcı hesabına bağlayarak , kullanıcıların birden çok kimlik doğrulama sağlayıcısı kullanarak uygulamanızda oturum açmasına izin verebilirsiniz .

Bir kullanıcının oturumunu kapatmak için signOut: arayın.

Swift

    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. Hataları İşleme .