E-posta bağlantılarını kullanarak Firebase ile kimlik doğrulama

Kullanıcıya, oturum açmak için tıklayabileceği bir bağlantı içeren e-posta göndererek oturum açmasını sağlamak için Firebase Authentication'ı kullanabilirsiniz. Bu işlem sırasında kullanıcının e-posta adresi de doğrulanır.

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

  • Kolay kayıt ve oturum açma.
  • Uygulamalarda şifrelerin yeniden kullanılması riskini azaltır. Bu durum, iyi seçilmiş şifrelerin bile güvenliğini zayıflatabilir.
  • Kullanıcıyı kimlik doğrulama ve aynı zamanda kullanıcının bir e-posta adresinin yasal sahibi olduğunu doğrulama özelliği.
  • Kullanıcıların oturum açmak için erişilebilir bir e-posta hesabı olması yeterlidir. Telefon numarası veya sosyal medya hesabı sahipliği gerekmez.
  • Kullanıcı, mobil cihazda zahmetli olabilecek bir şifre girmeden (veya şifreyi hatırlamadan) güvenli bir şekilde oturum açabilir.
  • Daha önce bir e-posta tanımlayıcısı (şifre veya federasyon) ile oturum açmış mevcut bir kullanıcı, yalnızca e-posta ile oturum açacak şekilde yükseltilebilir. Örneğin, şifresini unutan bir kullanıcı, şifresini sıfırlamasına gerek kalmadan oturum açabilir.

Başlamadan önce

  1. Henüz yapmadıysanız Başlarken kılavuzundaki adımları uygulayın.

  2. Firebase projeniz için e-posta bağlantısı ile oturum açma özelliğini etkinleştirin.

    Kullanıcıların e-posta bağlantısıyla oturum açmasını sağlamak için öncelikle Firebase projenizde e-posta sağlayıcıyı ve e-posta bağlantısıyla oturum açma yöntemini etkinleştirmeniz gerekir:

    1. Firebase konsolunda Güvenlik > Kimlik doğrulama'ya gidin.

    2. Oturum açma yöntemi sekmesinde, E-posta/Şifre oturum açma sağlayıcısını etkinleştirin. E-posta bağlantısı ile oturum açma özelliğini kullanmak için e-posta/şifre ile oturum açma özelliğinin 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ıdan e-posta adresini girmesini isteyen bir arayüz gösterin ve ardından Firebase'in kimlik doğrulama bağlantısını kullanıcının e-posta adresine göndermesini istemek için sendSignInLinkToEmail() işlevini çağırın.

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

    • url: Yerleştirilecek derin bağlantı ve iletilecek ek durum. Henüz yapmadıysanız bağlantının alanını yetkili alanlar listesine ekleyin:

      1. Firebase konsolunda Authentication (Kimlik Doğrulama) > Settings (Ayarlar) sekmesine gidin.

      2. Yetkili alanlar bölümünde Alan ekle'yi tıklayın ve bağlantının alanını ekleyin.

      Uygulama cihazına yüklenmemişse ve yüklenememişse bağlantı, kullanıcıyı bu URL'ye yönlendirir.

    • androidPackageName ve IOSBundleId: Oturum açma bağlantısı bir Android veya iOS cihazda açıldığında kullanılacak uygulamalar. Firebase Dynamic Links'i, e-posta işlem bağlantılarını mobil uygulamalar üzerinden açacak şekilde yapılandırma hakkında daha fazla bilgi edinin.

    • handleCodeInApp: true olarak ayarlayın. Oturum açma işlemi, bant dışı diğer e-posta işlemlerinin (şifre sıfırlama ve e-posta doğrulamaları) aksine her zaman uygulamada tamamlanmalıdır. Bunun nedeni, akışın sonunda kullanıcının oturum açmış olması ve kimlik doğrulama durumunun uygulamada kalıcı hale getirilmesidir.

    • dynamicLinkDomain: (Kullanımdan kaldırıldı, linkDomain kullanın) Bir proje için birden fazla özel dinamik bağlantı alanı tanımlandığında, bağlantının belirtilen bir mobil uygulama kullanılarak açılacağı zaman (örneğin, example.page.link) hangisinin kullanılacağını belirtin. Aksi takdirde ilk alan otomatik olarak seçilir.

    • linkDomain: Bağlantı, belirtilen bir mobil uygulama kullanılarak açılacaksa kullanılacak isteğe bağlı özel Firebase Hosting alanı. Alan, Firebase Hosting'de yapılandırılmalı ve projenin sahibi olmalıdır. Bu, varsayılan bir barındırma alanı olamaz (web.app veya firebaseapp.com). Bu ayar, desteği sonlandırılan dynamicLinkDomain ayarının yerini alır.

    var acs = ActionCodeSettings(
        // URL you want to redirect back to. The domain (www.example.com) for this
        // URL must be whitelisted in the Firebase Console.
        url: 'https://www.example.com/finishSignUp?cartId=1234',
        // This must be true
        handleCodeInApp: true,
        iOSBundleId: 'com.example.ios',
        androidPackageName: 'com.example.android',
        // installIfNotAvailable
        androidInstallApp: true,
        // minimumVersion
        androidMinimumVersion: '12');
    
  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 aynı cihazda e-posta ile oturum açma işlemini tamamlaması durumunda kullanıcının e-posta adresini kaydedin.

    var emailAuth = 'someemail@domain.com';
    FirebaseAuth.instance.sendSignInLinkToEmail(
            email: emailAuth, actionCodeSettings: acs)
        .catchError((onError) => print('Error sending email verification $onError'))
        .then((value) => print('Successfully sent email verification'));
    });
    

Güvenlikle ilgili endişeler

Oturum açma bağlantısının, oturum açma akışı tamamlanırken kullanıcının e-posta adresinin sağlanmasını gerektiren Firebase Auth tarafından istenmeyen bir kullanıcı olarak veya istenmeyen bir cihazda oturum açmak için kullanılmasını önleyin. Oturum açma işleminin başarılı olması için bu e-posta adresinin, oturum açma bağlantısının ilk gönderildiği adresle eşleşmesi gerekir.

Oturum açma e-postasını gönderirken e-posta adreslerini yerel olarak (ör. SharedPreferences kullanarak) depolayarak, oturum açma bağlantısını istedikleri cihazda açan kullanıcılar için bu akışı kolaylaştırabilirsiniz. Ardından, akışı tamamlamak için bu adresi kullanın. Yönlendirme URL'si parametrelerinde kullanıcının e-posta adresini iletmeyin ve oturum ekleme saldırılarına yol açabileceğinden bu adresi yeniden kullanmayın.

Oturum açma işlemi tamamlandıktan sonra, daha önce doğrulanmamış oturum açma mekanizmaları kullanıcıdan kaldırılır ve mevcut oturumlar geçersiz kılınır. Örneğin, daha önce aynı e-posta adresi ve şifreyle doğrulanmamış bir hesap oluşturulmuşsa kimliğe bürünerek sahipliği iddia eden ve doğrulanmamış hesabı oluşturan kişinin doğrulanmamış e-posta adresi ve şifreyle tekrar oturum açmasını engellemek için kullanıcının şifresi kaldırılır.

Ayrıca, bağlantınızın aracı sunucular tarafından olası bir şekilde ele geçirilmesini önlemek için üretimde bir HTTPS URL'si kullandığınızdan emin olun.

Oturum açma işlemini tamamlama

Firebase Dynamic Links'in desteği sonlandırıldı. Artık oturum açma bağlantısı göndermek için Firebase Hosting kullanılmaktadır. Platforma özgü yapılandırma kılavuzlarını inceleyin:

Mobil uygulama üzerinden oturum açma işleminin tamamlanması için uygulamanın gelen uygulama bağlantısını algılayacak, temel derin bağlantıyı ayrıştıracak ve ardından oturum açma işlemini tamamlayacak şekilde yapılandırılması gerekir.

  1. Bağlantı işleyicinizde, bağlantının e-posta bağlantısı kimlik doğrulaması için olup olmadığını kontrol edin. Bu durumda, oturum açma işlemini tamamlayın.

    // Confirm the link is a sign-in with email link.
    if (FirebaseAuth.instance.isSignInWithEmailLink(emailLink)) {
      try {
        // The client SDK will parse the code from the link for you.
        final userCredential = await FirebaseAuth.instance
            .signInWithEmailLink(email: emailAuth, emailLink: emailLink);
    
        // You can access the new user via userCredential.user.
        final emailAddress = userCredential.user?.email;
    
        print('Successfully signed in with email link!');
      } catch (error) {
        print('Error signing in with email link.');
      }
    }
    

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 kimlik doğrulaması yapmış bir kullanıcı, bu oturum açma yöntemini mevcut hesabına ekleyebilir.

Aradaki fark, işlemin ikinci yarısında görülür:

final authCredential = EmailAuthProvider
    .credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
    await FirebaseAuth.instance.currentUser
        ?.linkWithCredential(authCredential);
} catch (error) {
    print("Error linking emailLink credential.");
}

Bu özellik, hassas bir işlem gerçekleştirilmeden önce e-posta bağlantısı kullanıcısının kimliğini yeniden doğrulamak için de kullanılabilir.

final authCredential = EmailAuthProvider
    .credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
    await FirebaseAuth.instance.currentUser
        ?.reauthenticateWithCredential(authCredential);
} catch (error) {
    print("Error reauthenticating credential.");
}

Ancak akış, orijinal kullanıcının oturum açmadığı farklı bir cihazda sona erebileceğ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ıya bazı durumlar eklenebilir.

Projenizi 15 Eylül 2023'te veya sonrasında oluşturduysanız e-posta numaralandırma koruması varsayılan olarak etkindir. Bu özellik, projenizin kullanıcı hesaplarının güvenliğini artırır ancak daha önce tanımlayıcı öncelikli akışları uygulamak için önerdiğimiz fetchSignInMethodsForEmail() yöntemini devre dışı bırakır.

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

Daha fazla ayrıntı için e-posta numaralandırma koruması ile ilgili dokümanları inceleyin.

Sonraki adımlar

Bir kullanıcı yeni bir hesap oluşturduktan sonra bu hesap, Firebase projenizin bir parçası olarak saklanır ve kullanıcının kullandığı oturum açma yönteminden bağımsız olarak projenizdeki her uygulamada kullanıcıyı tanımlamak için kullanılabilir.

Uygulamalarınızda, kullanıcının temel profil bilgilerini User nesnesinden alabilirsiniz. Kullanıcıları yönetme başlıklı makaleyi inceleyin.

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

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

Bir kullanıcının oturumunu kapatmak için signOut() işlevini çağırın:

await FirebaseAuth.instance.signOut();