Buka konsol

Menautkan Beberapa Penyedia Autentikasi ke Akun di Android

Anda dapat mengizinkan pengguna untuk login ke aplikasi Anda menggunakan beberapa penyedia autentikasi, dengan menautkan kredensial penyedia autentikasi ke akun pengguna yang ada. Pengguna bisa diidentifikasi dengan ID pengguna Firebase yang sama, apa pun penyedia autentikasi yang mereka gunakan untuk login. Misalnya, pengguna yang login dengan sandi bisa menautkan akun Google dan login dengan salah satu metode tersebut di lain waktu. Atau, seorang pengguna anonim bisa menautkan akun Facebook, kemudian login dengan Facebook untuk melanjutkan penggunaan aplikasi Anda.

Sebelum Anda memulai

Tambahkan dukungan untuk dua penyedia autentikasi atau lebih (mungkin dengan menyertakan autentikasi anonim) ke aplikasi Anda.

Menghubungkan kredensial penyedia autentikasi ke akun pengguna

Untuk menautkan kredensial penyedia autentikasi ke akun pengguna yang ada:

  1. Buat agar pengguna login menggunakan salah satu penyedia atau metode autentikasi.
  2. Selesaikan alur login untuk penyedia autentikasi baru hingga, tetapi tidak termasuk, tahap pemanggilan salah satu metode FirebaseAuth.signInWith. Misalnya, dapatkan token ID Google, token akses Facebook, atau alamat email dan sandi pengguna tersebut.
  3. Dapatkan AuthCredential untuk penyedia autentikasi baru:

    Login dengan Google

    Java

    AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);

    Kotlin

    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)
    Login dengan Facebook

    Java

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());

    Kotlin

    val credential = FacebookAuthProvider.getCredential(token.token)
    Login dengan email-sandi

    Java

    AuthCredential credential = EmailAuthProvider.getCredential(email, password);

    Kotlin

    val credential = EmailAuthProvider.getCredential(email, password)
  4. Teruskan objek AuthCredential ke metode linkWithCredential yang digunakan pengguna yang login:

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

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

    Panggilan ke linkWithCredential akan gagal jika kredensial sudah disambungkan ke akun pengguna lain. Dalam situasi ini, Anda harus menangani penggabungan akun dan data terkait yang sesuai untuk aplikasi Anda:

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

    Kotlin

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

Jika panggilan ke linkWithCredential berhasil, pengguna dapat login menggunakan penyedia autentikasi yang telah disambungkan dan mengakses data Firebase yang sama.

Membatalkan tautan penyedia autentikasi dari akun pengguna

Anda dapat membatalkan tautan penyedia autentikasi dari akun, sehingga pengguna tidak dapat login lagi dengan penyedia tersebut.

Untuk membatalkan tautan penyedia autentikasi dari akun pengguna, teruskan ID penyedia ke metode unlink. Anda dapat memperoleh ID penyedia dari penyedia autentikasi yang terhubung ke pengguna dengan memanggil getProviderData.

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

Kotlin

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