Save the date - Google I/O returns May 18-20. Register to get the most out of the digital experience: Build your schedule, reserve space, participate in Q&As, earn Google Developer profile badges, and more. Register now
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

İOS'ta E-posta Bağlantısını Kullanarak Firebase ile Kimlik Doğrulama

Firebase Authentication'ı, bir kullanıcıya oturum açmak için tıklayabilecekleri bir bağlantı içeren bir e-posta göndererek oturum açmak için kullanabilirsiniz. İşlemde, kullanıcının e-posta adresi de doğrulanır.

E-posta ile oturum açmanın birçok avantajı vardır:

  • Düşük sürtünmeli kayıt ve oturum açma.
  • Uygulamalar arasında şifrenin yeniden kullanılması riskinin daha düşük olması, iyi seçilmiş şifrelerin bile güvenliğini tehlikeye atabilir.
  • Bir kullanıcının kimliğini doğrulama yeteneği, aynı zamanda kullanıcının bir e-posta adresinin yasal sahibi olduğunu doğrular.
  • Bir kullanıcının oturum açmak için yalnızca erişilebilir bir e-posta hesabına ihtiyacı vardır. Telefon numarasının veya sosyal medya hesabının sahipliği gerekmez.
  • Bir kullanıcı, bir mobil cihazda kullanışsız olabilecek bir parola sağlamaya (veya hatırlamaya) gerek kalmadan güvenli bir şekilde oturum açabilir.
  • Daha önce bir e-posta tanımlayıcısıyla (parola veya birleşik) oturum açan mevcut bir kullanıcı, yalnızca e-posta ile oturum açmak için yükseltilebilir. Örneğin, şifresini unutan bir kullanıcı, şifresini sıfırlamaya gerek kalmadan yine de oturum açabilir.

Sen başlamadan önce

  1. Firebase'i iOS projenize ekleyin . Pod Podfile şu kapsülleri ekleyin:
    pod 'Firebase/Auth'
    
  2. Uygulamanızı henüz Firebase projenize bağlamadıysanız, bunu Firebase konsolundan yapın .

Kullanıcıları e-posta bağlantısıyla oturum açmak için önce Firebase projeniz için E-posta sağlayıcısını ve E-posta bağlantısı oturum açma yöntemini etkinleştirmeniz gerekir:

  1. In Firebase konsoluna , Auth bölümünü açın.
  2. Oturum açma yöntemi sekmesinde, E-posta / Şifre sağlayıcısını etkinleştirin. E-posta bağlantısı oturum açmayı kullanmak için e-posta / şifre oturum açmanın etkinleştirilmesi gerektiğini unutmayın.
  3. Aynı bölümde, E-posta bağlantısı (şifresiz oturum açma) oturum açma yöntemini etkinleştirin.
  4. Kaydet'i tıklayın .

Kimlik doğrulama akışını başlatmak için kullanıcıya, kullanıcıdan e-posta adresini vermesini isteyen bir arayüz sendSignInLinkToEmail:actionCodeSettings:completion: ve ardından sendSignInLinkToEmail:actionCodeSettings:completion: kimlik doğrulama bağlantısını kullanıcının e-postasına göndermesini isteyin.

  1. ActionCodeSettings e-posta bağlantısının nasıl oluşturulacağına ilişkin talimatlar sağlayan ActionCodeSettings nesnesini oluşturun. Aşağıdaki alanları ayarlayın:

    • url: Yerleştirilecek derin bağlantı ve iletilecek ek durum. Bağlantının etki alanı, Oturum açma yöntemi sekmesine (Kimlik Doğrulama -> Oturum açma yöntemi) gidilerek bulunabilen Firebase Konsolu yetkili etki alanları listesinde beyaz listeye eklenmelidir.
    • iOSBundleID ve androidPackageName: Bir Android veya iOS cihazında oturum açma bağlantısı açıldığında kullanılacak uygulamalar. Firebase Dynamic Links'in mobil uygulamalar aracılığıyla e-posta eylem bağlantılarını açacak şekilde nasıl yapılandırılacağı hakkında daha fazla bilgi edinin.
    • handleCodeInApp: True olarak ayarlayın. Diğer bant dışı e-posta işlemlerinden (parola sıfırlama ve e-posta doğrulamaları) farklı olarak oturum açma işlemi her zaman uygulamada tamamlanmalıdır. Bunun nedeni, akışın sonunda kullanıcının oturum açması ve Yetki durumunun uygulama içinde kalmasıdır.
    • dynamicLinkDomain: Bir proje için birden çok özel dinamik bağlantı etki alanı tanımlandığında, bağlantı belirli bir mobil uygulama aracılığıyla açıldığında hangisinin kullanılacağını belirtin (örneğin, example.page.link ). Aksi takdirde, ilk alan otomatik olarak seçilir.

    Swift

    let actionCodeSettings = ActionCodeSettings()
    actionCodeSettings.url = URL(string: "https://www.example.com")
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = true
    actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!)
    actionCodeSettings.setAndroidPackageName("com.example.android",
                                             installIfNotAvailable: false, minimumVersion: "12")
    

    Amaç-C

    FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init];
    [actionCodeSettings setURL:[NSURL URLWithString:@"https://www.example.com"]];
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = YES;
    [actionCodeSettings setIOSBundleID:[[NSBundle mainBundle] bundleIdentifier]];
    [actionCodeSettings setAndroidPackageName:@"com.example.android"
                        installIfNotAvailable:NO
                               minimumVersion:@"12"];
    

    ActionCodeSettings hakkında daha fazla bilgi edinmek için E-posta Eylemlerinde Geçiş Durumu bölümüne bakın.

  2. Kullanıcıdan e-postasını isteyin.

  3. Kimlik doğrulama bağlantısını kullanıcının e-postasına gönderin ve kullanıcının e-posta oturumunu aynı cihazda tamamlaması durumunda kullanıcının e-postasını kaydedin.

    Swift

    Auth.auth().sendSignInLink(toEmail:email,
                               actionCodeSettings: actionCodeSettings) { error in
      // ...
        if let error = error {
          self.showMessagePrompt(error.localizedDescription)
          return
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        UserDefaults.standard.set(email, forKey: "Email")
        self.showMessagePrompt("Check your email for link")
        // ...
    }
    

    Amaç-C

    [[FIRAuth auth] sendSignInLinkToEmail:email
                       actionCodeSettings:actionCodeSettings
                               completion:^(NSError *_Nullable error) {
      // ...
        if (error) {
          [self showMessagePrompt:error.localizedDescription];
           return;
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        [NSUserDefaults.standardUserDefaults setObject:email forKey:@"Email"];
        [self showMessagePrompt:@"Check your email for link"];
        // ...
    }];
    

Güvenlik endişeleri

Bir oturum açma bağlantısının istenmeyen bir kullanıcı olarak veya istenmeyen bir cihazda oturum açmak için kullanılmasını önlemek için Firebase Auth, oturum açma akışını tamamlarken kullanıcının e-posta adresinin sağlanmasını gerektirir. Oturum açmanın başarılı olması için, bu e-posta adresinin, oturum açma bağlantısının orijinal olarak gönderildiği adresle eşleşmesi gerekir.

Oturum açma e-postasını gönderirken e-posta adreslerini yerel olarak saklayarak, oturum açma bağlantısını, bağlantıyı istedikleri cihazda açan kullanıcılar için bu akışı kolaylaştırabilirsiniz. Ardından, akışı tamamlamak için bu adresi kullanın.

Oturum açma işlemi tamamlandıktan sonra, önceki tüm doğrulanmamış oturum açma mekanizmaları kullanıcıdan kaldırılacak ve mevcut tüm oturumlar geçersiz kılınacaktır. Örneğin, bir kişi daha önce aynı e-posta ve parolayla doğrulanmamış bir hesap oluşturduysa, sahipliğini üstlenen ve bu doğrulanmamış hesabı oluşturan kimliğe bürünenin aynı hesapla tekrar oturum açmasını önlemek için kullanıcının parolası kaldırılır.

Bir iOS mobil uygulamasında oturum açmayı tamamlama

Firebase Authentication, e-posta bağlantısını bir mobil cihaza göndermek için Firebase Dynamic Links'i kullanır. Mobil uygulama aracılığıyla oturum açmanın tamamlanması için, uygulamanın gelen uygulama bağlantısını algılayacak, temeldeki derin bağlantıyı ayrıştıracak ve ardından oturum açmayı tamamlayacak şekilde yapılandırılması gerekir.

Firebase Auth, bir mobil uygulamada açılması amaçlanan bir bağlantı gönderirken Firebase Dynamic Links'i kullanır. Bu özelliği kullanmak için Firebase Konsolu'nda Dinamik Bağlantıların yapılandırılması gerekir.

  1. Firebase Dynamic Links'i etkinleştirin:

    1. Firebase konsolunda Dinamik Bağlantılar bölümünü açın.
    2. Henüz Dinamik Bağlantılar şartlarını kabul etmediyseniz ve bir Dinamik Bağlantılar alanı oluşturmadıysanız, şimdi yapın.

      Zaten bir Dinamik Bağlantılar alanı oluşturduysanız, bunu bir yere not edin. Bir Dynamic Links alanı tipik olarak aşağıdaki örneğe benzer:

      example.page.link

      İOS veya Android uygulamanızı gelen bağlantıya müdahale edecek şekilde yapılandırdığınızda bu değere ihtiyacınız olacaktır.

  2. İOS uygulamalarını yapılandırma:

    1. Bu bağlantıları iOS uygulamanızdan işlemeyi planlıyorsanız, iOS paket kimliğinin Firebase Konsolu proje ayarlarında belirtilmesi gerekir. Ek olarak, App Store Kimliği ve Apple Geliştirici Ekip Kimliğinin de belirtilmesi gerekir.
    2. Ayrıca, e-posta eylemi işleyici etki alanınızı, uygulama yeteneklerinizde bir İlişkilendirilmiş Etki Alanı olarak yapılandırmanız gerekecektir. Varsayılan olarak, e-posta eylemi işleyicisi aşağıdaki örnek gibi bir etki alanında barındırılır:
      APP_ID.firebaseapp.com
    3. Uygulamanızı iOS 8 ve daha eski sürümlere dağıtmayı planlıyorsanız, iOS paket kimliğinizi gelen URL'ler için özel bir şema olarak ayarlamanız gerekecektir.
    4. Bununla ilgili daha fazla bilgi için iOS Dinamik Bağlantıları Alma talimatlarına bakın .

Bağlantıyı yukarıda açıklandığı şekilde aldıktan sonra, bunun e-posta bağlantısı kimlik doğrulaması için kullanıldığını doğrulayın ve oturum açma işlemini tamamlayın.

Swift

if Auth.auth().isSignIn(withEmailLink: link) {
        Auth.auth().signIn(withEmail: email, link: self.link) { (user, error) in
          // ...
        }
}

Amaç-C

if ([[FIRAuth auth] isSignInWithEmailLink:link]) {
    [[FIRAuth auth] signInWithEmail:email
                               link:link
                         completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
      // ...
    }];
}

Bir Android uygulamasında e-posta bağlantısıyla oturum açmanın nasıl ele alınacağını öğrenmek için Android kılavuzuna bakın.

Bir web uygulamasında e-posta bağlantısıyla oturum açmanın nasıl ele alınacağını öğrenmek için Web kılavuzuna bakın.

Bu kimlik doğrulama yöntemini mevcut bir kullanıcıya da bağlayabilirsiniz. Örneğin, daha önce telefon numarası gibi başka bir sağlayıcıyla kimliği doğrulanmış bir kullanıcı, bu oturum açma yöntemini mevcut hesabına ekleyebilir.

Fark, operasyonun ikinci yarısında olacaktır:

Swift

  let credential = EmailAuthCredential.credential(withEmail:email
                                                       link:link)
  Auth.auth().currentUser?.link(with: credential) { authData, error in
    if (error) {
      // And error occurred during linking.
      return
    }
    // The provider was successfully linked.
    // The phone user can now sign in with their phone number or email.
  }

Amaç-C

  FIRAuthCredential *credential =
      [FIREmailAuthProvider credentialWithEmail:email link:link];
  [FIRAuth auth].currentUser
      linkWithCredential:credential
              completion:^(FIRAuthDataResult *_Nullable result,
                           NSError *_Nullable error) {
    if (error) {
      // And error occurred during linking.
      return;
    }
    // The provider was successfully linked.
    // The phone user can now sign in with their phone number or email.
  }];

Bu, hassas bir işlemi çalıştırmadan önce bir e-posta bağlantısı kullanıcısının kimliğini yeniden doğrulamak için de kullanılabilir.

Swift

  let credential = EmailAuthProvider.credential(withEmail:email
                                                       link:link)
  Auth.auth().currentUser?.reauthenticate(with: credential) { authData, error in
    if (error) {
      // And error occurred during re-authentication.
      return
    }
    // The user was successfully re-authenticated.
  }

Amaç-C

  FIRAuthCredential *credential =
      [FIREmailAuthCredential credentialWithEmail:email link:link];
  [FIRAuth auth].currentUser
      reauthenticateWithCredential:credential
                        completion:^(FIRAuthDataResult *_Nullable result,
                                     NSError *_Nullable error) {
    if (error) {
      // And error occurred during re-authentication
      return;
    }
    // The user was successfully re-authenticated.
  }];

Ancak akış, orijinal kullanıcının oturum açmadığı farklı bir cihazda sona erebileceğinden, bu akış tamamlanamayabilir. Bu durumda, kullanıcıya bağlantıyı aynı cihazda açmaya zorlamak için bir hata gösterilebilir. İşlem türü ve kullanıcı kimliği hakkında bilgi sağlamak için bağlantıda bazı durumlar geçirilebilir.

E-posta ile hem şifre hem de bağlantı tabanlı oturum açmayı destekliyorsanız, bir şifre / bağlantı kullanıcısı için oturum açma yöntemini ayırt etmek için fetchSignInMethodsForEmail kullanın. Bu, kullanıcıdan önce e-postasını vermesinin istendiği ve ardından oturum açma yönteminin sunulduğu tanımlayıcı öncelikli akışlar için kullanışlıdır:

Swift

 // After asking the user for their email.
 Auth.auth().fetchSignInMethods(forEmail: email) { signInMethods, error in
   // This returns the same array as fetchProviders(forEmail:completion:) but for email
   // provider identified by 'password' string, signInMethods would contain 2
   // different strings:
   // 'emailLink' if the user previously signed in with an email/link
   // 'password' if the user has a password.
   // A user could have both.
   if (error) {
     // Handle error case.
   }
   if (!signInMethods.contains(EmailPasswordAuthSignInMethod)) {
     // User can sign in with email/password.
   }
   if (!signInMethods.contains(EmailLinkAuthSignInMethod)) {
     // User can sign in with email/link.
   }
 }

Amaç-C

 // After asking the user for their email.
 [FIRAuth auth] fetchSignInMethodsForEmail:email
                                completion:^(NSArray *_Nullable signInMethods,
                                             NSError *_Nullable error) {
   // This returns the same array as fetchProvidersForEmail but for email
   // provider identified by 'password' string, signInMethods would contain 2
   // different strings:
   // 'emailLink' if the user previously signed in with an email/link
   // 'password' if the user has a password.
   // A user could have both.
   if (error) {
     // Handle error case.
   }
   if (![signInMethods containsObject:FIREmailPasswordAuthSignInMethod]) {
     // User can sign in with email/password.
   }
   if (![signInMethods containsObject:FIREmailLinkAuthSignInMethod]) {
     // User can sign in with email/link.
   }
 }];

Yukarıda açıklandığı gibi e-posta / şifre ve e-posta / bağlantı, farklı oturum açma yöntemleriyle aynı FIREmailAuthProvider (aynı PROVIDER_ID ) olarak kabul edilir.

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 . Kullanıcıları Yönetme konusuna bakın.

  • Firebase Realtime Database ve Cloud Storage Güvenlik Kurallarınızda , oturum auth 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 .