Apple Platforms'da E-posta Bağlantısını Kullanarak Firebase ile Kimlik Doğrula

Firebase Authentication'ı kullanarak bir kullanıcıya e-posta göndererek oturum açabilirsiniz oturum açmak için tıklayabilecekleri bir bağlantı yer alır. Bu süreçte kullanıcının e-posta adresi de doğrulanır.

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

  • Kayıt ve oturum açma işlemlerini kolaylaştırın.
  • Uygulamalarda şifrelerin yeniden kullanılması ihtimali daha düşüktür ve bu da güvenliği olumsuz etkileyebilir. doğru şekilde seçilmiş şifreler oluşturabilirsiniz.
  • Bir kullanıcının kimliğini doğrularken aynı zamanda kullanıcının bir e-posta adresinin yasal sahibidir.
  • Kullanıcının oturum açmak için yalnızca erişilebilir bir e-posta hesabına ihtiyacı vardır. Hiçbir sahipliği yoksa telefon numarası veya sosyal medya hesabı gereklidir.
  • Kullanıcı, herhangi bir güvenlik onayı sağlamadan (veya hatırlamadan) Bu da mobil cihazlarda kullanışsız olabilir.
  • Daha önce bir e-posta tanımlayıcısı (şifre) ile oturum açmış mevcut bir kullanıcı veya birleşik) yalnızca e-posta ile oturum açacak şekilde yükseltilebilir. Örneğin, şifresini unutan bir kullanıcı tekrar oturum açmaya gerek kalmadan oturum açabilir. şifresini sıfırlayabilir.

Başlamadan önce

Firebase bağımlılıklarını yükleyip yönetmek için Swift Package Manager'ı kullanın.

  1. Xcode'da, uygulama projeniz açıkken Dosya > Paket Ekle'yi tıklayın.
  2. İstendiğinde Firebase Apple platformlar SDK deposunu ekleyin:
  3.   https://github.com/firebase/firebase-ios-sdk.git
    .
  4. Firebase Authentication kitaplığını seçin.
  5. -ObjC işaretini, hedefinizin derleme ayarlarındaki Diğer Bağlayıcı İşaretleri bölümüne ekleyin.
  6. İşlemi tamamladığınızda, Xcode otomatik olarak arka planda tutmalarını sağlar.

Kullanıcıların e-posta bağlantısı ile oturum açmasını sağlamak için önce E-posta sağlayıcısını etkinleştirmeniz ve Firebase projeniz için e-posta bağlantısı oturum açma yöntemi:

  1. Firebase konsolunda Kimlik Doğrulama bölümüne bakın.
  2. Oturum açma yöntemi sekmesinde, E-posta/Şifre sağlayıcısını etkinleştirin. Not e-posta bağlantısıyla oturum açmayı kullanmak için e-posta/şifre oturum açma etkinleştirilmelidir.
  3. Aynı bölümde, E-posta bağlantısı (şifresiz oturum açma) oturum açmayı etkinleştirin. yöntemidir.
  4. Kaydet'i tıklayın.

Kimlik doğrulama akışını başlatmak için kullanıcıya kullanıcıdan e-posta adresini girmesini ve ardından telefonla aramasını ister Firebase'i istemek için sendSignInLink Kimlik doğrulama bağlantısını kullanıcının e-postasına gönderin.

  1. Firebase'e sağlamak için ActionCodeSettings nesnesini oluşturun. E-posta bağlantısının nasıl oluşturulacağıyla ilgili talimatlar. Aşağıdaki alanları ayarlayın:

    • url: Yerleştirilecek derin bağlantı ve iletilecek ek durumlar. Bağlantının alanı, Firebase Konsolu'nun Yetkili alan adları (Oturum açma yöntemi sekmesine gidilerek bulunabilir) (Kimlik doğrulama -> Oturum açma yöntemi).
    • iOSBundleID ve androidPackageName : Oturum açma bağlantısı yapılırken kullanılacak uygulamalar Android veya Apple cihazda açıldığından emin olun. Şu işlemler hakkında daha fazla bilgi edinin: Firebase Dynamic Links'i yapılandırın e-posta işlemi bağlantılarını mobil uygulamalar aracılığıyla açmak için.
    • HandCodeInApp: True olarak ayarlanır. Oturum açma işlemi her zaman uygulamada tamamlanması, diğer bant dışı e-posta işlemlerinin (şifre) sıfırlama ve e-posta doğrulamaları). Bunun nedeni, akışın sonunda kullanıcıların Kullanıcının oturum açmış olması beklenir ve Yetki durumu şu süre içinde devam eder: görebilirsiniz.
    • DynamicLinkDomain: Birden fazla özel dinamik bağlantı alan adı tanımlandığında bağlantı şununla açılacağında hangisinin kullanılacağını belirtin: Belirli bir mobil uygulama (örneğin, example.page.link). Aksi halde ilk alan adı 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")
    

    Objective-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 İşlemlerinde İletim Durumu bölümüne bakın.

  2. Kullanıcıdan e-posta adresini isteyin.

  3. Kimlik doğrulama bağlantısını kullanıcının e-posta adresine gönderin ve kullanıcının e-postasını kaydedin Kullanıcı, e-postayla oturum açma işlemini aynı cihazda tamamlamalıdır.

    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")
        // ...
    }
    

    Objective-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üvenlikle ilgili sorunlar

Oturum açma bağlantısının istenmeyen kullanıcı olarak veya istenmeyen bir cihazdaysa Firebase Auth, kullanıcının e-posta adresinin ne zaman sağlandığını göreceğiz. Oturum açma işleminin başarılı olması için bu e-posta adresi, oturum açma bağlantısının gönderildiği adresle eşleşmelidir.

Oturum açma bağlantısını aynı bağlantı istediğinde e-posta adresini yerel olarak depolayarak oturum açma e-postasını gönderin. Ardından, akışı tamamlamak için bu adresi kullanın.

Oturum açma işlemi tamamlandıktan sonra, önceki doğrulanmamış tüm oturum açma yöntemleri kaldırılır ve mevcut tüm oturumlar geçersiz kılınır. Örneğin, bir kullanıcı daha önce veya e-posta adresini ve şifreyi çıkardıktan sonra, kullanıcının şifresi hesabın sahibi olduğunu iddia eden ve bu doğrulanmamış hesabı oluşturan kişinin kimliğine bürünen: aynı hesapla tekrar oturum açmayı deneyin.

Oturum açma işlemini Apple mobil uygulamasında tamamlama

Firebase Authentication, e-posta bağlantısını bir mobil cihaz Oturum açma işlemini mobil uygulama aracılığıyla tamamlamak için gelen uygulama bağlantısını algılayacak şekilde yapılandırılması gerekir; altındaki derin bağlantıyı tıklayın ve ardından oturum açma işlemini tamamlayın.

Firebase Auth, bir mobil uygulamada açılması amaçlanan bağlantıdır. Bunu kullanmak için özelliği yoksa, Firebase Konsolu'nda Dynamic Links'in yapılandırılması gerekir.

  1. Firebase Dynamic Links'i etkinleştirin:

    1. Firebase konsolunda Dynamic Links bölümünü açın.
    2. Dynamic Links şartlarını henüz kabul etmediyseniz ve Dynamic Links oluşturduysanız kullanıyorsanız bunu hemen yapın.

      Daha önce Dynamic Links alanı oluşturduysanız bunu not edin. Dynamic Links alan genellikle aşağıdaki örnekteki gibi görünür:

      example.page.link

      Apple veya Android uygulamanızı aşağıdaki amaçlarla yapılandırırken bu değere ihtiyacınız olacaktır: izlemesi için bir istek oluşturur.

  2. Apple uygulamalarını yapılandırma:

    1. Uygulamanızdan bu bağlantıları işlemeyi planlıyorsanız paket kimliğinin Firebase Konsolu'nda belirtilmesi gerekiyor iyi bir fırsattır. Buna ek olarak, App Store Kimliği ve Apple Developer Ekip kimliğinin de belirtilmesi gerekir.
    2. Ayrıca, e-posta işlem işleyici alan adınızı Uygulama özelliklerinizde ilişkili alan. Varsayılan olarak e-posta işlem işleyicisi, aşağıdaki örnektekine benzer bir alan adı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 paket kimliğinizi gelen e-posta adresi için özel bir şema olarak ayarlamanız gerekir URL'ler.
    4. Bu konuyla ilgili daha fazla bilgi için Apple platformu Dynamic Links ile ilgili talimatları alma.

Yukarıda açıklandığı şekilde bağlantıyı aldıktan sonra bağlantının e-posta için olduğunu doğrulayın bağlantı kimlik doğrulamasını kullanı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
          // ...
        }
}

Objective-C

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

Android cihazlarda e-posta bağlantısıyla oturum açma işlemini nasıl yapacağınızı öğrenmek için Android kılavuzuna bakın.

Web'de e-posta bağlantısıyla oturum açma işleminin nasıl yapılacağını öğrenmek için Web rehberine bakın.

Bu kimlik doğrulama yöntemini mevcut bir kullanıcıya da bağlayabilirsiniz. Örneğin: Kullanıcının kimliği daha önce başka bir sağlayıcıda (ör. telefon numarası) doğrulandığında bu oturum açma yöntemini mevcut hesabına ekleyebilir.

Fark, işlemin 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.
  }

Objective-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, bir e-posta bağlantısı kullanıcısının kimliğini yeniden doğrulamak için de kullanılabilir. hassas bir işlemdir.

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.
  }

Objective-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ış, asıl kullanıcının çalıştığı farklı bir cihazda sona erebileceği için giriş yapılmadı, bu akış tamamlanmayabilir. Bu durumda, bir hata bağlantıyı aynı cihazda açmaya zorlamak için kullanıcıya gösterilir. Biraz durum bilgisi sağlamak için bağlantıda iletilebilir. ve kullanıcı kimliği.

Projenizi 15 Eylül 2023'te veya sonrasında oluşturduysanız e-posta numaralandırma koruması varsayılan olarak etkindir. Bu özellik, hesabınızın güvenliğini projenin kullanıcı hesaplarına uygulanır, ancak fetchSignInMethodsForEmail() devre dışı bırakılır yöntemini kullanmayı tercih ettik.

Projeniz için e-posta numaralandırma korumasını devre dışı bırakabilirsiniz ancak kullanmanızı önermeyiz.

E-posta numaralandırma koruması ile ilgili dokümanlara göz atın inceleyebilirsiniz.

Sonraki adımlar

Kullanıcı ilk kez oturum açtığında yeni bir kullanıcı hesabı oluşturulur ve bilgileri (kullanıcı adı ve şifre, telefon numarası) Numara veya kimlik doğrulama sağlayıcı bilgileri (oturum açan kullanıcı). Bu yeni Firebase projenizin bir parçası olarak saklanır ve aşağıdaki verileri tanımlamak için kullanılabilir: nasıl oturum açarsa açsın, projenizdeki tüm uygulamalarda kullanılır.

  • Uygulamalarınızda, kullanıcıların temel profil bilgilerini şuradan alabilirsiniz: User nesnesini tanımlayın. Kullanıcıları Yönetme başlıklı makaleye göz atın.

  • Firebase Realtime Database ve Cloud Storage içinde Güvenlik Kuralları'nı kullanarak şunları yapabilirsiniz: auth değişkeninden, oturum açmış kullanıcının benzersiz kullanıcı kimliğini alabilirsiniz. ve kullanıcının hangi verilere erişebileceğini kontrol etmek için kullanılır.

Kullanıcıların çoklu kimlik doğrulama kullanarak uygulamanızda oturum açmasına izin verebilirsiniz yetkilendirme sağlayıcısının kimlik bilgilerini hesaba katılmaz.

Bir kullanıcının oturumunu kapatmak için numaralı telefonu arayın signOut: değerleridir.

Swift

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;
}

Ayrıca tüm kimlik doğrulama aralığı için hata işleme kodu da ekleyebilirsiniz. hatalar. Hataları İşleme bölümüne bakın.