Android'de bir hesaba birden fazla kimlik doğrulama sağlayıcı bağlama

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ıyı kullanarak uygulamanızda oturum açmasına izin verebilirsiniz. Kullanıcılar, oturum açmak için kullandıkları kimlik doğrulama sağlayıcıdan bağımsız olarak aynı Firebase kullanıcı kimliğiyle tanımlanabilir. Örneğin, şifreyle oturum açan bir kullanıcı Google Hesabı bağlayabilir ve gelecekte her iki yöntemle de oturum açabilir. Alternatif olarak, anonim bir kullanıcı Facebook hesabı bağlayabilir ve daha sonra uygulamanızı kullanmaya devam etmek için Facebook ile oturum açabilir.

Başlamadan önce

Uygulamanıza iki veya daha fazla kimlik doğrulama sağlayıcısı için destek ekleyin (anonim kimlik doğrulama da dahil olabilir).

Kimlik doğrulama sağlayıcı kimlik bilgilerini mevcut bir kullanıcı hesabına bağlamak için:

  1. Herhangi bir kimlik doğrulama sağlayıcısı veya yöntemi kullanarak kullanıcının oturumunu açın.
  2. Yeni kimlik doğrulama sağlayıcısı için oturum açma akışını, FirebaseAuth.signInWith yöntemlerinden birini çağırma işlemi hariç olmak üzere tamamlayın. Örneğin, kullanıcının Google kimlik jetonunu, Facebook erişim jetonunu veya e-posta adresini ve şifresini alabilirsiniz.
  3. Yeni kimlik doğrulama sağlayıcı için AuthCredential alın:

    Google ile Oturum Açma

    Kotlin

    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)

    Java

    AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);
    Facebook ile Giriş

    Kotlin

    val credential = FacebookAuthProvider.getCredential(token.token)

    Java

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    E-posta ve şifreyle oturum açma

    Kotlin

    val credential = EmailAuthProvider.getCredential(email, password)

    Java

    AuthCredential credential = EmailAuthProvider.getCredential(email, password);
  4. AuthCredential nesnesini, oturum açmış kullanıcının linkWithCredential yöntemine iletin:

    Kotlin

    auth.currentUser!!.linkWithCredential(credential)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                Log.d(TAG, "linkWithCredential:success")
                val user = task.result?.user
                updateUI(user)
            } else {
                Log.w(TAG, "linkWithCredential:failure", task.exception)
                Toast.makeText(
                    baseContext,
                    "Authentication failed.",
                    Toast.LENGTH_SHORT,
                ).show()
                updateUI(null)
            }
        }

    Java

    mAuth.getCurrentUser().linkWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "linkWithCredential:success");
                        FirebaseUser user = task.getResult().getUser();
                        updateUI(user);
                    } else {
                        Log.w(TAG, "linkWithCredential:failure", task.getException());
                        Toast.makeText(AnonymousAuthActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }
                }
            });

    Kimlik bilgileri başka bir kullanıcı hesabına zaten bağlıysa linkWithCredential ile yapılan görüşme başarısız olur. Bu durumda, hesapları ve ilişkili verileri uygulamanıza uygun şekilde birleştirmeniz gerekir:

    Kotlin

    val prevUser = auth.currentUser
    auth.signInWithCredential(credential)
        .addOnSuccessListener { result ->
            val currentUser = result.user
            // Merge prevUser and currentUser accounts and data
            // ...
        }
        .addOnFailureListener {
            // ...
        }

    Java

    FirebaseUser prevUser = FirebaseAuth.getInstance().getCurrentUser();
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    FirebaseUser currentUser = task.getResult().getUser();
                    // Merge prevUser and currentUser accounts and data
                    // ...
                }
            });

linkWithCredential çağrısı başarılı olursa kullanıcı artık bağlı kimlik doğrulama sağlayıcılarından herhangi birini kullanarak oturum açabilir ve aynı Firebase verilerine erişebilir.

Kullanıcının artık bu sağlayıcıyla oturum açamaması için bir kimlik doğrulama sağlayıcısının bağlantısını hesaptan kaldırabilirsiniz.

Bir kimlik doğrulama sağlayıcısının bağlantısını kullanıcı hesabından kaldırmak için sağlayıcı kimliğini unlink yöntemine iletin. Bir kullanıcıya bağlı kimlik doğrulama sağlayıcılarının sağlayıcı kimliklerini getProviderData numaralı telefonu arayarak alabilirsiniz.

Kotlin

Firebase.auth.currentUser!!.unlink(providerId)
    .addOnCompleteListener(this) { task ->
        if (task.isSuccessful) {
            // Auth provider unlinked from account
            // ...
        }
    }

Java

mAuth.getCurrentUser().unlink(providerId)
        .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    // Auth provider unlinked from account
                    // ...
                }
            }
        });

Sorun giderme

Birden fazla hesabı bağlamaya çalışırken hatalarla karşılaşırsanız doğrulanmış e-posta adresleriyle ilgili dokümanlara göz atın.