Android'de Bir Hesaba Birden Çok Kimlik Doğrulama Sağlayıcısı Bağlayın

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. 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, bir şifreyle oturum açan bir kullanıcı, bir Google hesabını bağlayabilir ve gelecekte herhangi bir yöntemle oturum açabilir. Veya 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.

Sen başlamadan önce

Uygulamanıza iki veya daha fazla kimlik doğrulama sağlayıcısı (muhtemelen anonim kimlik doğrulama dahil) için destek 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ısı için oturum açma akışını FirebaseAuth.signInWith yöntemlerinden birini çağırana kadar tamamlayın, ancak buna dahil etmeyin. Örneğin, kullanıcının Google Kimliği jetonunu, Facebook erişim jetonunu veya e-posta ve şifresini alın.
  3. Yeni kimlik doğrulama sağlayıcısı için bir AuthCredential alın:

    Google'da Oturum Açma

    Kotlin+KTX

    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)

    Java

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

    Kotlin+KTX

    val credential = FacebookAuthProvider.getCredential(token.token)

    Java

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    E-posta-şifre girişi

    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ştirmeyi uygulamanız için uygun şekilde ele almalısınız:

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

Bir kimlik doğrulama sağlayıcısının bağlantısını bir hesaptan kaldırabilirsiniz, böylece kullanıcı artık o sağlayıcıyla oturum açamaz.

Bir kimlik doğrulama sağlayıcısının bir 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ğlı auth sağlayıcılarının sağlayıcı kimliklerini getProviderData çağırarak 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
                    // ...
                }
            }
        });