E-posta Bağlantılarını Kullanarak Firebase ile Kimlik Doğrula

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-posta ile 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ğrulamayla birlikte 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ılar, 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 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ı 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. Bağlantının alan adı, Firebase konsolundaki yetkilendirilmiş alanlar listesinde bulunmalıdır. Bu listeye Ayarlar sekmesine giderek ulaşabilirsiniz (Kimlik Doğrulama -> Ayarlar -> Yetkilendirilmiş Alanlar). Uygulama kullanıcının 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 Dinamik Bağlantıları, 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) hangi alanın 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 e-posta ile oturum açma işlemini aynı cihazda 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ı zorunlu kılarak istenmeyen bir kullanıcı olarak veya istenmeyen bir cihazda oturum açmak için kullanılmasını önler. 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 bağlantısını, bağlantı isteğinde bulundukları cihazda açan kullanıcılar için bu akışı kolaylaştırabilirsiniz. Örneğin, oturum açma e-postası gönderirken e-posta adreslerini yerel olarak (ör. SharedPreferences kullanarak) saklayabilirsiniz. Ardından, akışı tamamlamak için bu adresi kullanın. Yönlendirme URL'si parametrelerinde kullanıcının e-posta adresini iletmeyin ve bunu yeniden kullanmayın. Aksi takdirde oturum ekleme saldırıları etkinleştirilebilir.

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şturulduysa sahipliği iddia eden ve doğrulanmamış hesabı oluşturan kişinin, doğrulanmamış e-posta adresi ve şifreyle tekrar oturum açmasını önlemek 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 engellenmesini ö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 özel yapılandırma için kılavuzları uygulayın:

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 olur:

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 kimlik öncelikli akışları uygulamak için daha önce ö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.

Kullanıcıların, kimlik doğrulama sağlayıcı kimlik bilgilerini bağlayarak 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();