Android'de E-posta Bağlantısı'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 kullanıcıyı oturum açmaya yönlendirmek için Firebase Authentication özelliğini 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ğrulamak ve aynı zamanda kullanıcının bir e-posta adresinin yasal sahibi olduğunu doğrulamak.
  • Kullanıcıların oturum açmak için erişilebilir bir e-posta hesabı olması yeterlidir. Telefon numarası veya sosyal medya hesabı sahibi olmanız 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

Android projenizi oluşturma

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

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

    Ayrıca, Firebase Authentication ayarlarını yaparken 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:34.0.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.3.0")
    }

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

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

    Firebase BoM kullanmamayı tercih ederseniz 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 BoM kullanmanızı önemle tavsiye ederiz. Bu sayede tüm sürümlerin uyumlu olması sağlanır.

    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:24.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.3.0")
    }

Firebase projeniz için e-posta bağlantısı ile giriş özelliğini etkinleştirme

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ısını ve e-posta bağlantısıyla oturum açma yöntemini etkinleştirmeniz gerekir:

  1. Firebase konsolunda Auth (Kimlik Doğrulama) 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ıyla oturum açma özelliğini kullanmak için e-posta/şifreyle 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ıya e-posta adresini girmesini isteyen bir arayüz gösterin ve ardından sendSignInLinkToEmail işlevini çağırarak Firebase'in kimlik doğrulama bağlantısını kullanıcının e-posta adresine göndermesini isteyin.

  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 Console'daki yetkili alanlar listesinde beyaz listeye eklenmelidir. Bu listeye, Oturum açma yöntemi sekmesine (Kimlik doğrulama -> Oturum açma yöntemi) giderek ulaşabilirsiniz. Uygulama cihazına yüklenmemişse ve yüklenemiyorsa bağlantı, kullanıcıyı bu URL'ye yönlendirir.
    • androidPackageName ve iOSBundleId: Firebase Authentication'ın, yalnızca web'de kullanılabilen veya Android ya da Apple cihazda açılan bir mobil bağlantı oluşturup oluşturmaması gerektiğini belirlemesine yardımcı olur.
    • handleCodeInApp: Doğru olarak ayarlayın. Oturum açma işlemi, diğer bant dışı e-posta işlemlerinden (şifre sıfırlama ve e-posta doğrulamaları) farklı olarak 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.
    • linkDomain: Bir proje için özel Hosting bağlantı alanları tanımlandığında, bağlantının belirli bir mobil uygulama tarafından açılacağı durumlarda hangi alanın kullanılacağını belirtin. Aksi takdirde, varsayılan alan otomatik olarak seçilir (örneğin, PROJECT_ID.firebaseapp.com).
    • dynamicLinkDomain: Kullanımdan kaldırıldı. Bu parametreyi belirtmeyin.

    Kotlin

    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 Durum Geçirme 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-posta adresine gönderin ve kullanıcının e-posta ile oturum açma işlemini aynı cihazda tamamlaması ihtimaline karşı kullanıcının e-posta adresini kaydedin.

    Kotlin

    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

Oturum açma bağlantısının, oturum açma akışı tamamlanırken kullanıcının e-posta adresinin girilmesini zorunlu kılarak istenmeyen bir kullanıcı olarak veya istenmeyen bir cihazda oturum açmak için kullanılmasını önlemek üzere Firebase Authentication gereklidir. 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) saklayarak, 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ını etkinleştirebileceğinden e-posta adresini 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, 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.

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

Firebase Authentication, e-posta bağlantısını mobil cihaza göndermek için Firebase Hosting kullanır. 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. Daha fazla bilgi için Android Uygulama Bağlantıları dokümanlarına göz atın.

Firebase Hosting ürününü yapılandır

Firebase Authentication, mobil uygulamada açılması amaçlanan bir bağlantı oluşturup gönderirken Firebase Hosting alanlarını kullanır. Sizin için varsayılan bir Firebase Hosting alanı zaten yapılandırılmış.

  1. Firebase Hosting alan adını yapılandırın:

    Firebase konsolunda Hosting (Barındırma) bölümünü açın.

    • Mobil uygulamalarda açılan e-posta bağlantısı için varsayılan alanı kullanmak istiyorsanız varsayılan sitenize gidip varsayılan Hosting alanınızı not edin. Varsayılan Hosting alanı genellikle şu şekilde görünür: PROJECT_ID.firebaseapp.com.

      Uygulamanızı gelen bağlantıyı yakalayacak şekilde yapılandırırken bu değere ihtiyacınız olacaktır.

    • E-posta bağlantısı için özel alan kullanmak istiyorsanız Firebase Hosting ile bir alan adı kaydedebilir ve bağlantının alan adı olarak bu alanı kullanabilirsiniz.

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

    Android uygulamanızdaki bu bağlantıları işlemek için uygulamanızın paket adının Firebase konsol proje ayarlarında belirtilmesi gerekir. Ayrıca, uygulama sertifikasının SHA-1 ve SHA-256'sı da sağlanmalıdır.

    Bu bağlantıların belirli bir etkinliğe yönlendirilmesini istiyorsanız AndroidManifest.xml dosyanızda bir amaç filtresi yapılandırmanız gerekir. Amaç filtresi, alanınızın e-posta bağlantılarını yakalamalıdır. AndroidManifest.xml içinde:

    <intent-filter android:autoVerify="true">
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.BROWSABLE" />
      <category android:name="android.intent.category.DEFAULT" />
      <data
        android:scheme="https"
        android:host="<PROJECT_ID>.firebaseapp.com or your custom domain"
        android:pathPrefix="/__/auth/links" />
    </intent-filter>
    

    Kullanıcılar, /__/auth/links yolu ve belirttiğiniz şema ve ana makine ile bir barındırma bağlantısı açtığında uygulamanız, bağlantıyı işlemek için bu amaç filtresiyle etkinliği başlatır.

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

Kotlin

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());
                    }
                }
            });
}

Apple uygulamasında e-posta bağlantısıyla oturum açma işlemini yönetme 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ğı hakkında bilgi edinmek için Web kılavuzu'na 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 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:

Kotlin

// 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 özellik, hassas bir işlem ç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

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

E-posta bağlantısı kimlik doğrulaması daha önce Firebase Dynamic Links kullanıyordu. Bu hizmet 25 Ağustos 2025'te kapatılacak.

Firebase Authentication Android SDK 23.2.0 sürümü veya üzeri ve Firebase BoM 33.9.0 sürümü veya üzeri için alternatif bir çözüm yayınladık.

Uygulamanız eski stil bağlantıları kullanıyorsa Firebase Hosting tabanlı yeni sisteme uygulamanızı taşımanız gerekir.

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 bilgi için e-posta numaralandırma koruması ile ilgili dokümanları inceleyin.

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 (kullanıcı adı ve ş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 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ç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 bu kimliği kullanabilirsiniz.

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

Bir kullanıcının oturumunu kapatmak için signOut numaralı telefonu arayın:

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();