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ı 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ısından bağımsız olarak aynı Firebase kullanıcı kimliğiyle tanımlanabilir. Örneğin, şifreyle oturum açan bir kullanıcı, bir Google hesabını bağlayabilir ve gelecekte her iki yöntemle de oturum açabilir. Alternatif olarak, anonim bir kullanıcı bir Facebook hesabını 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ı (muhtemelen anonim kimlik doğrulama dahil) desteği ekleyin.

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ı için, FirebaseAuth.signInWith yöntemlerinden birini çağırarak en fazla (dahil değil) oturum açma akışını tamamlayın. Örneğin, kullanıcının Google kimliği jetonunu, Facebook erişim jetonunu veya e-posta adresini ve şifresini alabilirsiniz.
  3. Yeni kimlik doğrulama sağlayıcı için bir AuthCredential alın:

    Google ile Oturum Açma

    Kotlin+KTX

    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)

    Java

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

    Kotlin+KTX

    val credential = FacebookAuthProvider.getCredential(token.token)

    Java

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

    Kotlin+KTX

    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+KTX

    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 zaten başka bir kullanıcı hesabına bağlıysa linkWithCredential çağrısı başarısız olur. Bu durumda, hesapları ve ilişkili verileri birleştirme işlemini uygulamanız için uygun şekilde yapmanız gerekir:

    Kotlin+KTX

    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ı herhangi bir kimlik doğrulama sağlayıcıyı kullanarak oturum açabilir ve aynı Firebase verilerine erişebilir.

Kimlik doğrulama sağlayıcının bir hesapla bağlantısını kaldırabilirsiniz. Böylece, kullanıcı artık bu sağlayıcıda oturum açamaz.

Bir kimlik doğrulama sağlayıcının kullanıcı hesabıyla olan bağlantısını kaldırmak için sağlayıcı kimliğini unlink yöntemine iletin. Bir kullanıcıya bağlanan kimlik doğrulama sağlayıcılarının sağlayıcı kimliklerini getProviderData çağrısı yaparak alabilirsiniz.

Kotlin+KTX

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