Android'de 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 Authentication'ı 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ünmeli kayıt ve oturum açma.
  • Uygulamalar arasında, iyi seçilmiş parolaların bile güvenliğini tehlikeye atabilecek daha düşük parola yeniden kullanım riski.
  • Kullanıcının bir e-posta adresinin meşru sahibi olduğunu doğrularken aynı zamanda bir kullanıcının kimliğini 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ına veya sosyal medya hesabına sahip olmanız gerekmez.
  • Bir kullanıcı, bir mobil cihazda külfetli olabilecek bir parola sağlamaya (veya hatırlamaya) gerek kalmadan güvenli bir şekilde oturum açabilir.
  • Daha önce bir e-posta tanımlayıcısı (şifre veya birleşik) ile oturum açmış olan 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ırlamak zorunda kalmadan oturum açabilir.

Sen başlamadan önce

Android projenizi kurun

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

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

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

    Kotlin+KTX

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:32.3.1"))
    
        // 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-ktx")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:20.7.0")
    }

    Firebase Android BoM'yi kullandığınızda, uygulamanız her zaman Firebase Android kitaplıklarının uyumlu sürümlerini kullanır.

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

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

    Uygulamanızda birden çok Firebase kitaplığı kullanıyorsanız kitaplık sürümlerini yönetmek için tüm sürümlerin uyumlu olmasını sağlayan BoM'yi 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-ktx:22.1.2")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:20.7.0")
    }

    Java

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:32.3.1"))
    
        // 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:20.7.0")
    }

    Firebase Android BoM'yi kullandığınızda, uygulamanız her zaman Firebase Android kitaplıklarının uyumlu sürümlerini kullanır.

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

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

    Uygulamanızda birden çok Firebase kitaplığı kullanıyorsanız kitaplık sürümlerini yönetmek için tüm sürümlerin uyumlu olmasını sağlayan BoM'yi 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:22.1.2")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:20.7.0")
    }

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

  1. Firebase konsolunda Kimlik Doğrulama 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/parola 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, 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-posta adresine göndermesini istemek için sendSignInLinkToEmail 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 : Yerleştirilecek 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) gidilerek bulunabilen Firebase Konsolu yetkili etki alanları listesinde beyaz listeye alınmalıdır. Uygulama cihazında yüklü değilse ve uygulama yüklenemiyorsa, bağlantı kullanıcıyı bu URL'ye yönlendirecektir.
    • androidPackageName ve IOSBundleId : Bir Android veya Apple cihazında oturum açma bağlantısı açıldığında kullanılacak uygulamalar. Mobil uygulamalar yoluyla e-posta işlem bağlantılarını açmak için Firebase Dynamic Links'in nasıl yapılandırılacağı 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 kimlik doğrulama durumunun uygulama içinde kalmasıdır.
    • dynamicLinkDomain : Bir proje için birden fazla özel dinamik bağlantı alanı tanımlandığında, bağlantı belirli bir mobil uygulama aracılığıyla açılacağı zaman hangisinin kullanılacağını belirtin (örneğin, example.page.link ). Aksi takdirde, ilk etki alanı 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 Eylemlerinde Geçiş Durumu bölümüne bakın.

  2. Kullanıcıdan e-postasını 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 oturumunu aynı cihazda tamamlaması durumunda 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üvenlik endişeleri

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

Oturum açma e-postasını gönderdiğinizde, örneğin SharedPreferences'ı kullanarak e-posta adreslerini yerel olarak depolayarak, bağlantıyı istedikleri cihazda oturum açma bağlantısını açan kullanıcılar için bu akışı kolaylaştırabilirsiniz. Ardından, akışı tamamlamak için bu adresi kullanın. Kullanıcının e-postasını yeniden yönlendirme URL'si parametrelerinde iletmeyin ve oturum enjeksiyonlarını etkinleştirebileceği için yeniden kullanmayın.

Oturum açma işlemi tamamlandıktan sonra, daha önce doğrulanmamış tüm oturum açma mekanizmaları kullanıcıdan kaldırılacak ve mevcut tüm oturumlar geçersiz kılınacaktır. Örneğin, birisi daha önce aynı e-posta ve parolayla doğrulanmamış bir hesap oluşturduysa, sahiplik iddiasında bulunan ve bu doğrulanmamış hesabı oluşturan taklitçinin doğrulanmamış e-posta ve parolayla tekrar oturum açmasını önlemek için kullanıcının parolası kaldırılacaktır.

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

Bir Android 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ılaması, temeldeki derin bağlantıyı ayrıştırması ve ardından oturum açmayı tamamlaması için yapılandırılması gerekir.

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 Firebase Konsolunda Dinamik Bağlantılar yapılandırılmalıdır .

  1. Firebase Dynamic Links'i etkinleştirin:

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

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

      example.page.link

      Gelen bağlantıyı kesmek için Apple veya Android uygulamanızı yapılandırdığınızda bu değere ihtiyacınız olacak.

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

    1. Android uygulamanızdan bu linkleri işleyebilmeniz için Firebase Konsolu proje ayarlarında Android paket adının belirtilmesi gerekir. Ayrıca, başvuru sertifikasının SHA-1 ve SHA-256'sının sağlanması gerekmektedir.
    2. Artık bir dinamik bağlantı etki alanı eklediğinize ve Android uygulamanızın doğru yapılandırıldığından emin olduğunuza göre, 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 amaç filtresi yapılandırmanız gerekir. Bu, amaç filtresinde dinamik bağlantı etki alanınızı veya e-posta eylem işleyicisini belirterek yapılabilir. Varsayılan olarak, e-posta eylem işleyicisi aşağıdaki örnek gibi bir etki alanında barındırılır:
      PROJECT_ID.firebaseapp.com/
    4. Uyarılar:
      1. actionCodeSettings üzerinde ayarladığınız URL'yi niyet filtrenizde belirtmeyin.
      2. Dinamik bağlantı etki alanınızı oluştururken, kısa bir URL bağlantısı da oluşturmuş olabilirsiniz. Bu kısa URL aktarılmayacak; niyet filtrenizi onu bir android:pathPrefix özniteliğ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 yapılmaya ç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ı alma hakkında daha fazla bilgi için, Android Dinamik Bağlantıları Alma talimatlarına bakın.

Bağlantıyı yukarıda açıklandığı şekilde aldıktan sonra, bunun e-posta bağlantısı kimlik doğrulaması için tasarlandığı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 = "someemail@domain.com"

    // 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 = "someemail@domain.com";

    // 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çmanın nasıl yapılacağı 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çmayı nasıl yapacağınızı öğrenmek için Web kılavuzuna bakın.

Bu kimlik doğrulama yöntemini mevcut bir kullanıcıya da bağlayabilirsiniz. Örneğin, telefon numarası gibi daha önce 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:

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 bir 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ış, orijinal kullanıcının oturum açmadığı farklı bir cihazda sona erebileceğinden bu akış tamamlanmayabilir. Bu durumda, kullanıcıya bağlantıyı aynı cihazda açmaya zorlamak için bir hata gösterilebilir. İşlem türü ve kullanıcı kullanıcı kimliği hakkında bilgi sağlamak için bağlantıda bazı durumlar iletilebilir.

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 farklılaştırmak için fetchSignInMethodsForEmail kullanın. Bu, kullanıcıdan önce e-posta adresini 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:

Kotlin+KTX

Firebase.auth.fetchSignInMethodsForEmail(email)
    .addOnSuccessListener { result ->
        val signInMethods = result.signInMethods!!
        if (signInMethods.contains(EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD)) {
            // User can sign in with email/password
        } else if (signInMethods.contains(EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD)) {
            // User can sign in with email/link
        }
    }
    .addOnFailureListener { exception ->
        Log.e(TAG, "Error getting sign in methods for user", exception)
    }

Java

auth.fetchSignInMethodsForEmail(email)
        .addOnCompleteListener(new OnCompleteListener<SignInMethodQueryResult>() {
            @Override
            public void onComplete(@NonNull Task<SignInMethodQueryResult> task) {
                if (task.isSuccessful()) {
                    SignInMethodQueryResult result = task.getResult();
                    List<String> signInMethods = result.getSignInMethods();
                    if (signInMethods.contains(EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD)) {
                        // User can sign in with email/password
                    } else if (signInMethods.contains(EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD)) {
                        // User can sign in with email/link
                    }
                } else {
                    Log.e(TAG, "Error getting sign in methods for user", task.getException());
                }
            }
        });

Yukarıda açıklandığı gibi, e-posta/şifre 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ı ilk kez oturum açtıktan sonra, yeni bir kullanıcı hesabı oluşturulur ve kullanıcının oturum açtığı kimlik bilgilerine (yani, kullanıcı adı ve parolası, telefon numarası veya kimlik doğrulama sağlayıcı bilgileri) bağlanır. Bu yeni hesap, Firebase projenizin bir parçası olarak saklanı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. Bkz . Kullanıcıları Yönetin .

  • Firebase Gerçek Zamanlı Veritabanı 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ı 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 öğesini arayın:

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();