Catch up on everthing we announced at this year's Firebase Summit. Learn more

Apple Platformlarında E-posta Bağlantısını Kullanarak Firebase ile Kimlik Doğrulama

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 Firebase Kimlik Doğrulama'yı kullanabilirsiniz. Bu süreçte, kullanıcının e-posta adresi de doğrulanır.

E-posta ile oturum açmanın sayısız avantajı vardır:

  • Düşük sürtünme kaydı ve oturum açma.
  • Uygulamalar arasında daha düşük parola yeniden kullanım riski, bu da iyi seçilmiş parolaların bile güvenliğini tehlikeye atabilir.
  • Bir kullanıcının kimliğini doğrulama ve aynı zamanda kullanıcının bir e-posta adresinin yasal sahibi olduğunu doğrulama yeteneği.
  • Bir kullanıcının oturum açmak için yalnızca erişilebilir bir e-posta hesabına ihtiyacı vardır. Bir telefon numarası veya sosyal medya hesabı sahibi olmanız gerekmez.
  • Bir kullanıcı, bir mobil cihazda hantal olabilen bir şifre sağlamaya (veya hatırlamaya) gerek kalmadan güvenli bir şekilde oturum açabilir.
  • Daha önce bir e-posta tanımlayıcısı (parola veya birleşik) ile oturum açmış mevcut bir kullanıcı, yalnızca e-posta ile oturum açmak üzere yükseltilebilir. Örneğin, parolasını unutan bir kullanıcı, parolasını sıfırlamaya gerek kalmadan yine de oturum açabilir.

Sen başlamadan önce

Firebase bağımlılıklarını kurmak ve yönetmek için Swift Paket Yöneticisi'ni kullanın.

  1. Xcode olarak, uygulama açma projesi, gezinilebilen ile Dosya> Swift Paketleri> Paket Bağımlılık Ekle.
  2. İstendiğinde, Firebase Apple platformları SDK deposunu ekleyin:
  3.   https://github.com/firebase/firebase-ios-sdk
      
  4. Firebase Kimlik Doğrulama kitaplığını seçin.
  5. Bittiğinde, Xcode otomatik olarak bağımlılıklarınızı arka planda çözmeye ve indirmeye başlayacaktır.

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ştirmelisiniz:

  1. In Firebase konsoluna , Auth bölümünü açın.
  2. Yöntem sekmesinde İşaret Üzerine, E-posta / Şifre sağlayıcı sağlar. 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ını (şifresiz oturum açma) yöntemiyle oturum açma sağlar.
  4. Kaydet seçeneğini tıklayın.

Kimlik doğrulama akışını başlatır kullanıcı istemleri e-posta adresini temin etmek dair bir arayüz ile kullanıcıya sunmak ve daha sonra çağırmak için sendSignInLinkToEmail:actionCodeSettings:completion: isteğine Firebase kullanıcının e-posta kimlik doğrulama bağlantı göndermek söyledi.

  1. Construct ActionCodeSettings e-posta bağlantısını nasıl oluşturulduğu hakkında talimatlar Firebase sağlar nesneyi. Aşağıdaki alanları ayarlayın:

    • url: Gömülecek derin bağlantı ve iletilecek herhangi bir ek durum. Bağlantının etki alanı, Oturum Açma yöntemi sekmesine (Kimlik Doğrulama -> Oturum Açma yöntemi) giderek bulunabilen yetkili etki alanlarının Firebase Konsolu listesinde beyaz listeye eklenmelidir.
    • iOSBundleID ve androidPackageName : Bir Android veya Apple cihazında oturum açma bağlantısı açıldığında kullanılacak uygulamalar. Konusunda daha fazla bilgi Firebase Dinamik Linkler yapılandırmak mobil uygulamalar aracılığıyla açık-posta eylem bağlantıları.
    • handleCodeInApp: true olarak ayarlayın. Diğer bant dışı e-posta işlemlerinden (şifre sıfırlama ve e-posta doğrulamaları) farklı olarak, oturum açma işleminin her zaman uygulamada tamamlanması gerekir. Bunun nedeni, akışın sonunda kullanıcının oturum açmasının beklenmesi ve Auth durumunun uygulamada devam etmesidir.
    • dynamicLinkDomain: birden fazla özel dinamik bağlantı alanları bir proje, bağlantı belirtilen bir mobil uygulama üzerinden açılacak olduğunda hangisinin kullanılacağını belirtmek (örneğin, için tanımlandığında example.page.link ). Aksi takdirde, ilk alan otomatik olarak seçilir.

    Süratli

    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 üzerinde daha fazla bilgi için bakınız E-posta İşlemleri Pas Devlet bölümünde.

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

  3. Kullanıcının e-posta adresine kimlik doğrulama bağlantısını gönderin ve kullanıcının aynı cihazda e-posta oturum açma işlemini tamamlaması durumunda kullanıcının e-postasını kaydedin.

    Süratli

    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

Firebase Auth, istenmeyen bir kullanıcı olarak veya istenmeyen bir cihazda oturum açmak için bir oturum açma bağlantısının kullanılmasını önlemek için, oturum açma akışı tamamlanırken kullanıcının e-posta adresinin sağlanmasını gerektirir. Oturum açma işleminin 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.

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

Oturum açma tamamlandıktan sonra, önceki doğrulanmamış oturum açma mekanizmaları kullanıcıdan kaldırılacak ve mevcut oturumlar geçersiz kılınacaktır. Örneğin, birisi daha önce aynı e-posta ve şifre ile doğrulanmamış bir hesap oluşturduysa, sahipliği üstlenen ve bu doğrulanmamış hesabı oluşturan taklitçinin aynı hesapla tekrar oturum açmasını önlemek için kullanıcının şifresi kaldırılacaktır.

Bir Apple 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çma işleminin tamamlanması için uygulamanın, gelen uygulama bağlantısını algılayacak, temel alınan derin bağlantıyı ayrıştıracak ve ardından oturum açma işlemini tamamlayacak şekilde yapılandırılması gerekir.

Firebase Auth kullanan Firebase Dinamik Linkler mobil bir uygulamada açılacak içindir link gönderirken. Bu özelliği kullanmak için Firebase Konsolunda Dinamik Bağlantıların yapılandırılması gerekir.

  1. Firebase Dinamik Bağlantılarını Etkinleştirin:

    1. In Firebase konsoluna , Dinamik Linkler bölümünü açın.
    2. Henüz Dynamic Links şartlarını kabul etmediyseniz ve bir Dynamic Links etki alanı oluşturduysanız, bunu şimdi yapın.

      Zaten bir Dinamik Bağlantılar alanı oluşturduysanız, bunu not alın. Bir Dynamic Links etki alanı genellikle aşağıdaki örneğe benzer:

      example.page.link

      Apple veya Android uygulamanızı gelen bağlantıyı kesecek şekilde yapılandırırken bu değere ihtiyacınız olacak.

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

    1. Bu bağlantıları uygulamanızdan ele almayı planlıyorsanız, paket kimliğinin Firebase Konsolu proje ayarlarında belirtilmesi gerekir. Ayrıca App Store ID ve Apple Developer Team ID de belirtilmelidir.
    2. Ayrıca, uygulama yeteneklerinizde e-posta eylem işleyici etki alanınızı İlişkili Etki Alanı olarak yapılandırmanız gerekecektir. : Varsayılan olarak, e-posta eylem işleyicisi aşağıdaki örneğe benzer bir etki alanında barındırılan
      APP_ID.firebaseapp.com
    3. Uygulamanızı iOS 8 ve altı sürümlerine dağıtmayı planlıyorsanız, paket kimliğinizi gelen URL'ler için özel bir şema olarak ayarlamanız gerekir.
    4. Bu konuda daha fazla bilgi için bkz Apple platformu Dinamik Linkler talimatları alma .

Bağlantıyı yukarıda açıklandığı gibi aldıktan sonra, bunun e-posta bağlantısı doğrulaması için olduğunu doğrulayın ve oturum açmayı tamamlayın.

Süratli

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ındaki e-posta bağlantı ile oturum açma nasıl işleneceği konusunda bilgi edinmek için bkz Android rehber .

Bir web uygulamasında e-posta bağlantı ile oturum açma nasıl işleneceği konusunda bilgi edinmek için bkz Web rehberi .

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:

Süratli

  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ı yeniden doğrulamak için de kullanılabilir.

Süratli

  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 sonlanabileceğinden, bu akış tamamlanmayabilir. Bu durumda, kullanıcıyı 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ğer şifre ve bağlantı tabanlı oturum açma e-posta ile, yöntemini farklılaştırmak için oturum açma şifre / link kullanıcı için kullanımı hem destekleyen fetchSignInMethodsForEmail . Bu, kullanıcıdan önce e-postasını sağlamasının istendiği ve ardından oturum açma yönteminin sunulduğu tanımlayıcı öncelikli akışlar için kullanışlıdır:

Süratli

 // 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.
   }
 }];

E-posta / şifre ve e-posta / linke Yukarıda açıklandığı gibi aynı kabul edilir FIREmailAuthProvider (aynı PROVIDER_ID oturum açma farklı yöntemlerle).

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.

  • 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ı .