Google is committed to advancing racial equity for Black communities. See how.
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

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

Firebase Authentication'ı, 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 kullanabilirsiniz. İşlemde 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 genelinde şifrenin yeniden kullanılması riskinin daha düşük olması, iyi seçilmiş şifrelerin bile güvenliğine zarar verebilir.
  • Bir kullanıcının kimliğini doğrulama yeteneği, aynı zamanda kullanıcının bir e-posta adresinin yasal sahibi olduğunu doğrular.
  • Bir kullanıcının oturum açmak için yalnızca erişilebilir bir e-posta hesabına ihtiyacı vardır. Telefon numarasının veya sosyal medya hesabının sahipliği gerekmez.
  • Bir kullanıcı, bir mobil cihazda kullanışsız olabilecek bir parola sağlamaya (veya hatırlamaya) gerek olmadan güvenli bir şekilde oturum açabilir.
  • Daha önce bir e-posta tanımlayıcısıyla (parola veya federe) oturum açan mevcut bir kullanıcı, yalnızca e-posta ile oturum açmak için yükseltilebilir. Örneğin, şifresini unutan bir kullanıcı, şifresini sıfırlamaya gerek kalmadan yine de oturum açabilir.

Sen başlamadan önce

Android projenizi kurun

  1. Henüz yapmadıysanız, Android projenize Firebase'i ekleyin .
  2. Proje düzeyindeki build.gradle dosyanızda, hem buildscript hem de allprojects bölümlerinize Google'ın Maven deposunu dahil ettiğinizden emin olun.
  3. Firebase Authentication Android kitaplığı ve Google Play hizmetleri için bağımlılıkları modülünüze (uygulama düzeyi) Gradle dosyanıza (genellikle app/build.gradle ) app/build.gradle :

    implementation 'com.google.firebase:firebase-auth:19.4.0'
    implementation 'com.google.android.gms:play-services-auth:18.1.0'
    

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ştirmeniz gerekir:

  1. In Firebase konsoluna , 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ı oturum açmayı kullanmak için e-posta / şifre 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, kullanıcıdan e-posta adresini vermesini isteyen bir arayüz sendSignInLinkToEmail ve ardından sendSignInLinkToEmail kimlik doğrulama bağlantısını kullanıcının e-postasına göndermesini istemek için 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 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 eklenmelidir. 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 iOS cihazda oturum açma bağlantısı açıldığında kullanılacak uygulamalar. Firebase Dynamic Links'in mobil uygulamalar aracılığıyla e-posta eylem bağlantılarını açacak şekilde 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 (parola sıfırlama ve e-posta doğrulamaları) farklı olarak oturum açma işlemi her zaman uygulamada tamamlanmalıdır. Bunun nedeni, akışın sonunda kullanıcının oturum açması ve Yetki durumunun uygulama içinde kalmasıdır.
    • dynamicLinkDomain : Bir proje için birden fazla ö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, örnek. example.page.link ). Aksi takdirde ilk alan otomatik olarak seçilir.

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

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

    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.

    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.");
                    }
                }
            });

    Kotlin + KTX

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

Güvenlik endişeleri

Bir oturum açma bağlantısının istenmeyen bir kullanıcı olarak veya istenmeyen bir cihazda oturum açmak için 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 ilk gönderildiği adresle eşleşmesi gerekir.

Oturum açma bağlantısını, bağlantı talep ettikleri cihazda açan kullanıcılar için, oturum açma e-postasını gönderirken e-posta adreslerini yerel olarak (örneğin Paylaşılan Tercihler 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ği için yeniden kullanmayın.

Oturum açma işlemi 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, bir kişi daha önce aynı e-posta ve parola ile doğrulanmamış bir hesap oluşturduysa, sahipliğini talep eden ve bu doğrulanmamış hesabı oluşturan kimliğe bürünenin doğrulanmamış e-posta ve parola ile tekrar oturum açmasını önlemek için kullanıcının parolası kaldırılı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çmanın tamamlanması için, uygulamanın gelen uygulama bağlantısını algılayacak, temeldeki derin bağlantıyı ayrıştıracak ve ardından oturum açma işlemini tamamlayacak şekilde 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ın yapılandırılması gerekir .

  1. Firebase Dynamic Links'i etkinleştirin:

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

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

      example.page.link

      İOS veya Android uygulamanızı gelen bağlantıya müdahale edecek şekilde yapılandırdığınızda bu değere ihtiyacınız olacak.

  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. Ek olarak, uygulama sertifikasının SHA-1 ve SHA-256'sının sağlanması gerekir.
    2. Artık bir dinamik bağlantı alanı eklediğinize ve Android uygulamanızın doğru şekilde yapılandırıldığından emin olduğunuza göre, dinamik bağlantı, başlatıcı etkinliğinden başlayarak uygulamanıza yönlendirecektir.
    3. Dinamik bağlantının belirli bir etkinliğe yeniden yönlendirilmesini istiyorsanız, AndroidManifest.xml dosyanızda bir amaç filtresi yapılandırmanız gerekir. Bu, dinamik bağlantı alanınızı veya amaç filtresinde e-posta eylemi işleyicisini belirleyerek yapılabilir. Varsayılan olarak, e-posta eylemi işleyicisi aşağıdaki örnek gibi bir etki alanında 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 aktarılmayacaktır; Bir ile yakalamak için amaç filtresini yapılandırmak yok android:pathPrefix özniteliği. 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ğiniz şeyi isSignInWithEmailLink görmek için isSignInWithEmailLink gibi SDK yöntemlerini kullanabilirsiniz.
    5. Dinamik bağlantıları 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 kullanıldığını doğrulayın ve oturum açma işlemini tamamlayın.

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

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

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

Bir web uygulamasında e-posta bağlantısıyla oturum açmanın nasıl ele alınacağını öğrenmek için Web kılavuzuna 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ğrulanmış bir kullanıcı, bu oturum açma yöntemini mevcut hesabına ekleyebilir.

Aradaki fark operasyonun ikinci yarısında olacaktır:

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

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

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.

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

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

Ancak akış, orijinal kullanıcının oturum açmadığı farklı bir cihazda sona erebileceğinden, bu akış tamamlanamayabilir. 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ı kimliği hakkında bilgi sağlamak için bağlantıda bazı durumlar geçirilebilir.

E-posta ile hem şifre hem de bağlantı tabanlı oturum açmayı destekliyorsanız, bir şifre / 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ı vermesinin istendiği ve ardından oturum açma yönteminin sunulduğu önce tanımlayıcı akışları için kullanışlıdır:

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

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

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 oturum açan kullanıcı 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 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 konusuna bakın.

  • Firebase Realtime Database ve Cloud Storage Güvenlik Kurallarınızda , oturum auth kullanıcının benzersiz kullanıcı kimliğini auth değişkeninden alabilir ve bir kullanıcının hangi verilere erişebileceğini kontrol etmek için kullanabilirsiniz.

Yetkilendirme sağlayıcı 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 arayın:

Java

FirebaseAuth.getInstance().signOut();

Kotlin + KTX

Firebase.auth.signOut()