Android'de E-posta Bağlantısı Kullanarak Firebase ile Kimlik Doğrulama

Firebase Authentication'ı kullanarak bir kullanıcının oturum açmasını sağlayabilir ve tıklayarak oturum açmak için tıklayabileceği bir bağlantı içeren e-posta gönderebilirsiniz. Bu işlemde, kullanıcının e-posta adresi de doğrulanır.

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

  • Kolay kaydolma ve oturum açma.
  • Uygulamalar arasında şifrelerin yeniden kullanılması riskini azaltır. Bu da, iyi seçilmiş şifrelerin bile güvenliğini zayıflatabilir.
  • Bir kullanıcının kimliğini doğrularken aynı zamanda kullanıcının bir e-posta adresinin meşru sahibi olduğunu doğrulayabilme.
  • Oturum açmak için kullanıcının yalnızca erişilebilir bir e-posta hesabına ihtiyacı vardır. Telefon numarası veya sosyal medya hesabının sahipliği gerekmez.
  • Kullanıcı, şifre sağlamaya (veya hatırlamaya) gerek kalmadan güvenli bir şekilde oturum açabilir. Bu, mobil cihazlarda kullanımı zorlaştırabilir.
  • Daha önce bir e-posta tanımlayıcısı (şifre veya birleşik) ile oturum açmış mevcut bir kullanıcı, yalnızca e-posta ile oturum açacak şekilde yeni sürüme geçirilebilir. Örneğin, şifresini unutan bir kullanıcı, şifresini sıfırlamasına gerek kalmadan oturum açabilir.

Başlamadan önce

Android projenizi oluşturma

  1. Henüz yapmadıysanız Firebase'i Android projenize ekleyin.

  2. Modül (uygulama düzeyi) Gradle dosyanıza (genellikle <project>/<app-module>/build.gradle.kts veya <project>/<app-module>/build.gradle), Android için Firebase Authentication kitaplığına bağımlılığı ekleyin. Kitaplık sürümü oluşturmayı kontrol etmek için Firebase Android BoM'u kullanmanızı öneririz.

    Ayrıca, Firebase Authentication'ı ayarlamanın bir parçası olarak Google Play hizmetleri SDK'sını uygulamanıza eklemeniz gerekir.

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:33.1.0"))
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:21.2.0")
    }

    Firebase Android BoM kullanıldığında uygulamanız Firebase Android kitaplıklarının her zaman uyumlu sürümlerini kullanır.

    (Alternatif) Firebase kitaplığı bağımlılıklarını BoM'u kullanmadan ekleyin

    Firebase BoM'yi kullanmamayı seçerseniz her Firebase kitaplık sürümünü bağımlılık satırında belirtmeniz gerekir.

    Uygulamanızda birden fazla Firebase kitaplığı kullanıyorsanız kitaplık sürümlerini yönetmek için tüm sürümlerin uyumlu olmasını sağlamak için BoM kullanmanızı kesinlikle öneririz.

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth:23.0.0")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:21.2.0")
    }
    Kotlin'e özel bir kitaplık modülü mü arıyorsunuz? Ekim 2023'ten (Firebase BoM 32.5.0) itibaren, hem Kotlin hem de Java geliştiricileri ana kitaplık modülüne başvurabilir. (Ayrıntılar için Bu girişimle ilgili sık sorulan sorular bölümüne göz atın).

Kullanıcıların e-posta bağlantısıyla oturum açmasını istiyorsanız önce Firebase projeniz için E-posta sağlayıcısı ve E-posta bağlantısı 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çmayı kullanmak için e-posta/şifre ile oturum açmanın 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ıya, e-posta adresini girmesini isteyen bir arayüz sunun ve Firebase'in kimlik doğrulama bağlantısını kullanıcının e-postasına göndermesini istemek için sendSignInLinkToEmail numaralı telefonu arayı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 durumlar. Bağlantının alan adının, Firebase konsolu yetkili alanlar listesinde beyaz listeye eklenmiş olması gerekir. Bu listeye, Oturum açma yöntemi sekmesine (Kimlik doğrulama -> Oturum açma yöntemi) giderek ulaşabilirsiniz. Uygulama cihazda yüklü değilse ve uygulama yüklenemediyse bağlantı, kullanıcıyı bu URL'ye yönlendirir.
    • androidPackageName ve IOSBundleId: Bir Android veya Apple cihazda oturum açma bağlantısı açıldığında kullanılacak uygulamalar. E-posta işlemi bağlantılarını mobil uygulamalar aracılığıyla açmak için Firebase Dynamic Links'i nasıl yapılandıracağınız hakkında daha fazla bilgi edinin.
    • handleCodeInApp: True olarak ayarlayın. Bant dışı diğer 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çmış olması ve Yetkilendirme durumunun uygulama içinde devam etmesinin beklenmesidir.
    • dynamicLinkDomain: Bir proje için birden fazla özel dinamik bağlantı alan adı tanımlandığında, bağlantı belirtilen bir mobil uygulama aracılığıyla açılırken hangisinin kullanılacağını belirtin (örneğin, example.page.link). Aksi takdirde ilk alan adı otomatik olarak seçilir.

    Kotlin+KTX

    val actionCodeSettings = 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
        setIOSBundleId("com.example.ios")
        setAndroidPackageName(
            "com.example.android",
            true, // installIfNotAvailable
            "12", // minimumVersion
        )
    }

    Java

    ActionCodeSettings actionCodeSettings =
            ActionCodeSettings.newBuilder()
                    // URL you want to redirect back to. The domain (www.example.com) for this
                    // URL must be whitelisted in the Firebase Console.
                    .setUrl("https://www.example.com/finishSignUp?cartId=1234")
                    // This must be true
                    .setHandleCodeInApp(true)
                    .setIOSBundleId("com.example.ios")
                    .setAndroidPackageName(
                            "com.example.android",
                            true, /* installIfNotAvailable */
                            "12"    /* minimumVersion */)
                    .build();

    ActionCodeSettings hakkında daha fazla bilgi edinmek için E-posta İşlemlerinde Geçiş 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-postasına gönderin ve kullanıcının e-posta oturum açma işlemini aynı cihazda tamamlaması ihtimaline karşı kullanıcının e-postasını kaydedin.

    Kotlin+KTX

    Firebase.auth.sendSignInLinkToEmail(email, actionCodeSettings)
        .addOnCompleteListener { task ->
            if (task.isSuccessful) {
                Log.d(TAG, "Email sent.")
            }
        }

    Java

    FirebaseAuth auth = FirebaseAuth.getInstance();
    auth.sendSignInLinkToEmail(email, actionCodeSettings)
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "Email sent.");
                    }
                }
            });

Güvenlikle ilgili endişeler

Firebase Auth, oturum açma bağlantısının istenmeyen bir kullanıcı olarak veya istenmeyen bir cihazda oturum açmak üzere 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 ilk olarak 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ışı, oturum açma e-postasını gönderirken e-posta adreslerini yerel olarak depolayarak (örneğin, SharedPreferences'ı kullanarak) kullanıcılar için kolaylaştırabilirsiniz. Ardından akışı tamamlamak için bu adresi kullanın. Oturum yerleştirmeyi etkinleştirebileceği için, kullanıcının e-postasını yönlendirme URL'si parametrelerinde iletmeyin ve tekrar kullanın.

Oturum açma işlemi tamamlandıktan sonra, önceki doğrulanmamış oturum açma mekanizmaları kullanıcıdan kaldırılır ve mevcut oturumlar geçersiz hale gelir. Örneğin, daha önce bir kullanıcı aynı e-posta adresi ve şifreyle doğrulanmamış bir hesap oluşturduysa, hesabın sahibi olduğunu iddia eden ve bu doğrulanmamış hesabı oluşturan kişinin, doğrulanmamış e-posta 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 ara sunucular tarafından ele geçirilmesini önlemek için üretimde HTTPS URL'si kullandığınızdan emin olun.

Android uygulamasında oturum açma işlemini tamamlama

Firebase Authentication, e-posta bağlantısını bir mobil cihaza göndermek için Firebase Dynamic Links'i kullanır. Mobil uygulama üzerinden oturum açmanın tamamlanabilmesi için uygulama; 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ılmalıdır.

Firebase Auth, bir mobil uygulamada açılması amaçlanan bir bağlantı gönderirken Firebase Dynamic Links'i kullanır. Bu özelliği kullanmak için Dynamic Links'in Firebase Konsolu'nda yapılandırılmış olması gerekir.

  1. Firebase Dynamic Links'i etkinleştirin:

    1. Firebase konsolunda Dinamik Bağlantılar bölümünü açın.
    2. Dynamic Links şartlarını henüz kabul etmediyseniz ve bir Dynamic Links alan adı oluşturmadıysanız bunu hemen yapın.

      Daha önce bir Dynamic Links alan adı oluşturduysanız bunu not edin. Dynamic Links alan adı genellikle aşağıdaki örneğe benzer:

      example.page.link

      Apple veya Android uygulamanızı gelen bağlantıya müdahale edecek şekilde yapılandırırken bu değere ihtiyacınız olacaktır.

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

    1. Bu bağlantıları Android uygulamanızdan işleyebilmek için Android paket adının Firebase konsolu proje ayarlarında belirtilmesi gerekir. Ayrıca, uygulama sertifikasının SHA-1 ve SHA-256'sı sağlanmalıdır.
    2. Artık bir dinamik bağlantı alanı eklediğiniz ve Android uygulamanızın doğru yapılandırıldığından emin olduğunuz için dinamik bağlantı, başlatıcı etkinliğinden başlayarak uygulamanıza yönlendirilecektir.
    3. Dinamik bağlantının belirli bir etkinliğe yönlendirme yapmasını istiyorsanız AndroidManifest.xml dosyanızda bir intent filtresi yapılandırmanız gerekir. Bu, intent filtresinde dinamik bağlantı alan adınızı veya e-posta işlem işleyicisini belirterek yapılabilir. Varsayılan olarak, e-posta işlemi işleyici aşağıdaki örnekteki gibi bir alanda barındırılır:
      PROJECT_ID.firebaseapp.com/
    4. Uyarılar:
      1. Amaç filtrenizdeki actionCodeSettings'de ayarladığınız URL'yi belirtmeyin.
      2. Dinamik bağlantı alanınızı oluştururken bir kısa URL bağlantısı da oluşturmuş olabilirsiniz. Bu kısa URL iletilmeyecek; intent filtrenizi android:pathPrefix özelliğiyle yakalayacak şekilde yapılandırmayın. Bu, uygulamanızın farklı bölümlerinde farklı dinamik bağlantıları yakalayamayacağınız anlamına gelir. Ancak hangi işlemin gerçekleştirilmeye çalışıldığını görmek için bağlantıdaki mode sorgu parametresini kontrol edebilir veya uygulamanızın aldığı bir bağlantının istediğinizi yapıp yapmadığını görmek için isSignInWithEmailLink gibi SDK yöntemlerini kullanabilirsiniz.
    5. Dinamik bağlantıları alma hakkında daha fazla bilgi için Android Dynamic Links'i alma talimatları bölümüne bakın.

Bağlantıyı yukarıda açıklandığı gibi aldıktan sonra, e-posta bağlantısı kimlik doğrulaması için kullanıldığını doğrulayın ve oturum açma işlemini tamamlayın.

Kotlin+KTX

val auth = Firebase.auth
val intent = intent
val emailLink = intent.data.toString()

// Confirm the link is a sign-in with email link.
if (auth.isSignInWithEmailLink(emailLink)) {
    // Retrieve this from wherever you stored it
    val email = "[email protected]"

    // The client SDK will parse the code from the link for you.
    auth.signInWithEmailLink(email, emailLink)
        .addOnCompleteListener { task ->
            if (task.isSuccessful) {
                Log.d(TAG, "Successfully signed in with email link!")
                val result = task.result
                // You can access the new user via result.getUser()
                // Additional user info profile *not* available via:
                // result.getAdditionalUserInfo().getProfile() == null
                // You can check if the user is new or existing:
                // result.getAdditionalUserInfo().isNewUser()
            } else {
                Log.e(TAG, "Error signing in with email link", task.exception)
            }
        }
}

Java

FirebaseAuth auth = FirebaseAuth.getInstance();
Intent intent = getIntent();
String emailLink = intent.getData().toString();

// Confirm the link is a sign-in with email link.
if (auth.isSignInWithEmailLink(emailLink)) {
    // Retrieve this from wherever you stored it
    String email = "[email protected]";

    // The client SDK will parse the code from the link for you.
    auth.signInWithEmailLink(email, emailLink)
            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "Successfully signed in with email link!");
                        AuthResult result = task.getResult();
                        // You can access the new user via result.getUser()
                        // Additional user info profile *not* available via:
                        // result.getAdditionalUserInfo().getProfile() == null
                        // You can check if the user is new or existing:
                        // result.getAdditionalUserInfo().isNewUser()
                    } else {
                        Log.e(TAG, "Error signing in with email link", task.getException());
                    }
                }
            });
}

Bir Apple uygulamasında e-posta bağlantısıyla oturum açma işleminin nasıl gerçekleştirileceği hakkında daha fazla bilgi edinmek için Apple platformları kılavuzuna bakın.

Bir web uygulamasında 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, daha önce telefon numarası gibi başka bir sağlayıcıyla kimliği doğrulanan bir kullanıcı bu oturum açma yöntemini mevcut hesabına ekleyebilir.

Fark, işlemin ikinci yarısında olur:

Kotlin+KTX

// Construct the email link credential from the current URL.
val credential = EmailAuthProvider.getCredentialWithLink(email, emailLink)

// Link the credential to the current user.
Firebase.auth.currentUser!!.linkWithCredential(credential)
    .addOnCompleteListener { task ->
        if (task.isSuccessful) {
            Log.d(TAG, "Successfully linked emailLink credential!")
            val result = task.result
            // You can access the new user via result.getUser()
            // Additional user info profile *not* available via:
            // result.getAdditionalUserInfo().getProfile() == null
            // You can check if the user is new or existing:
            // result.getAdditionalUserInfo().isNewUser()
        } else {
            Log.e(TAG, "Error linking emailLink credential", task.exception)
        }
    }

Java

// Construct the email link credential from the current URL.
AuthCredential credential =
        EmailAuthProvider.getCredentialWithLink(email, emailLink);

// Link the credential to the current user.
auth.getCurrentUser().linkWithCredential(credential)
        .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "Successfully linked emailLink credential!");
                    AuthResult result = task.getResult();
                    // You can access the new user via result.getUser()
                    // Additional user info profile *not* available via:
                    // result.getAdditionalUserInfo().getProfile() == null
                    // You can check if the user is new or existing:
                    // result.getAdditionalUserInfo().isNewUser()
                } else {
                    Log.e(TAG, "Error linking emailLink credential", task.getException());
                }
            }
        });

Bu, hassas bir işlemi çalıştırmadan önce e-posta bağlantısı kullanıcısının kimliğini yeniden doğrulamak için de kullanılabilir.

Kotlin+KTX

// Construct the email link credential from the current URL.
val credential = EmailAuthProvider.getCredentialWithLink(email, emailLink)

// Re-authenticate the user with this credential.
Firebase.auth.currentUser!!.reauthenticateAndRetrieveData(credential)
    .addOnCompleteListener { task ->
        if (task.isSuccessful) {
            // User is now successfully reauthenticated
        } else {
            Log.e(TAG, "Error reauthenticating", task.exception)
        }
    }

Java

// Construct the email link credential from the current URL.
AuthCredential credential =
        EmailAuthProvider.getCredentialWithLink(email, emailLink);

// Re-authenticate the user with this credential.
auth.getCurrentUser().reauthenticateAndRetrieveData(credential)
        .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    // User is now successfully reauthenticated
                } else {
                    Log.e(TAG, "Error reauthenticating", task.getException());
                }
            }
        });

Ancak akış, asıl kullanıcının giriş yapmadığı farklı bir cihazda gerçekleşebileceğinden bu akış tamamlanmayabilir. Bu durumda, bağlantıyı aynı cihazda açmaya zorlamak için kullanıcıya bir hata gösterilebilir. İşlem türü ve kullanıcı benzersiz kimliği hakkında bilgi sağlamak için bağlantıda bazı durumlar geçirilebilir.

Projenizi 15 Eylül 2023'te veya sonrasında oluşturduysanız e-posta numaralandırma koruması varsayılan olarak etkindir. Bu özellik, projenizdeki 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 bilgi için e-posta numaralandırması koruması ile ilgili dokümanlara bakın.

Sonraki adımlar

Bir kullanıcı ilk kez oturum açtığında yeni bir kullanıcı hesabı oluşturulur ve oturum açan kullanıcının kimlik bilgilerine (kullanıcı adı, şifre, telefon numarası veya kimlik doğrulama sağlayıcı bilgileri) bağlanır. Bu yeni hesap Firebase projenizin bir parçası olarak depolanır ve kullanıcının nasıl oturum açtığına bakılmaksızın projenizdeki her uygulamada bir kullanıcıyı tanımlamak için kullanılabilir.

  • Uygulamalarınızda kullanıcının temel profil bilgilerini FirebaseUser 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çan kullanıcının benzersiz kullanıcı kimliğini auth değişkeninden alabilir ve kullanıcının erişebileceği verileri 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 fazla 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 numaralı telefonu arayın:

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();