E-posta Bağlantıları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

  1. Henüz yapmadıysanız, Başlarken kılavuzundaki adımları izleyin.

  2. Firebase projeniz için E-posta Bağlantısı oturum açmayı etkinleştirin.

    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. Firebase konsolunda , Yetkilendirme bölümünü açın.
    2. Oturum açma yöntemi sekmesinde E-posta/Parola 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ı (parolasız 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 vermesini isteyen bir arayüz sunun ve ardından Firebase'in kimlik doğrulama bağlantısını kullanıcının e-postasına göndermesini istemek için sendSignInLinkToEmail() 'i arayın.

  1. Firebase'e 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 : 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. Uygulama, cihazında yüklü değilse ve uygulama yüklenemezse, bağlantı kullanıcıyı bu URL'ye yönlendirir.

    • androidPackageName ve IOSBundleId : Bir Android veya iOS cihazında oturum açma bağlantısı açıldığında kullanılacak uygulamalar. Mobil uygulamalar aracılığıyla e-posta eylemi bağlantılarını açmak için Firebase Dinamik Bağlantılarını nasıl yapılandıracağınız hakkında daha fazla bilgi edinin.

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

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

    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ü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 (örneğin SharedPreferences kullanarak) depolayarak bu akışı kolaylaştırabilirsiniz. Ardından, akışı tamamlamak için bu adresi kullanın. Kullanıcının e-postasını yönlendirme URL parametrelerinde iletmeyin ve oturum enjeksiyonlarını etkinleştirebileceğinden yeniden 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 iddia eden ve bu doğrulanmamış hesabı oluşturan taklitçinin doğrulanmamış e-posta ve şifre ile tekrar oturum açmasını önlemek için kullanıcının şifresi kaldırılacaktır.

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

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.

  1. Kılavuzda Flutter'da Dinamik Bağlantılar almak için uygulamanızı ayarlayın.

  2. Bağlantı işleyicinizde, bağlantının e-posta bağlantısı doğrulaması için olup olmadığını kontrol edin ve öyleyse 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 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:

final userCredential = await FirebaseAuth.instance
    .signInWithEmailLink(email: emailAuth, emailLink: emailLink);
try {
    await FirebaseAuth.instance.currentUser
        ?.linkWithCredential(userCredential.credential!);
} catch (error) {
    print("Error linking emailLink credential.");
}

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.

final userCredential = await FirebaseAuth.instance
    .signInWithEmailLink(email: emailAuth, emailLink: emailLink);
try {
    await FirebaseAuth.instance.currentUser
        ?.reauthenticateWithCredential(userCredential.credential!);
} catch (error) {
    print("Error reauthenticating credential.");
}

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-posta ile hem parola hem de bağlantı tabanlı oturum açmayı destekliyorsanız, bir parola/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ı 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:

try {
    final signInMethods =
        await FirebaseAuth.instance.fetchSignInMethodsForEmail(emailAuth);
    final userExists = signInMethods.isNotEmpty;
    final canSignInWithLink = signInMethods
        .contains(EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD);
    final canSignInWithPassword = signInMethods
        .contains(EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD);
} on FirebaseAuthException catch (exception) {
    switch (exception.code) {
        case "invalid-email":
            print("Not a valid email address.");
            break;
        default:
            print("Unknown error.");
    }
}

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

Sonraki adımlar

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

Uygulamalarınızda, User nesnesinden kullanıcının temel profil bilgilerini alabilirsiniz. Kullanıcıları Yönetme konusuna bakın.

Firebase Gerçek Zamanlı Veritabanınız ve Bulut Depolama Güvenlik Kurallarınızda, oturum açmış kullanıcının benzersiz kullanıcı kimliğini auth değişkeninden alabilir ve bunu bir kullanıcının hangi verilere erişebileceğini kontrol etmek için kullanabilirsiniz.

Kimlik doğrulama sağlayıcısı 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() çağırın:

await FirebaseAuth.instance.signOut();