Ir a la consola

Vincula varios proveedores de autenticación con una cuenta en Android

Para permitir que los usuarios accedan a la app con varios proveedores de autenticación, puedes vincular las credenciales de estos proveedores con una cuenta de usuario existente. Los usuarios se pueden identificar por el mismo ID de usuario de Firebase, sin importar el proveedor de autenticación que hayan usado para acceder. Por ejemplo, un usuario que accedió con una contraseña puede vincular una cuenta de Google y después usar cualquiera de los dos métodos para acceder. Por otra parte, un usuario anónimo puede vincular una cuenta de Facebook y luego acceder con Facebook para continuar usando la app.

Antes de comenzar

Agrega compatibilidad para dos o más proveedores de autenticación (posiblemente incluida la autenticación anónima) a la app.

Vincula las credenciales del proveedor de autenticación con una cuenta de usuario

Para vincular las credenciales del proveedor de autenticación con una cuenta de usuario existente:

  1. El usuario debe acceder con cualquier proveedor o método de autenticación.
  2. Completa el flujo de acceso del proveedor de autenticación nuevo, pero solamente hasta el paso anterior a llamar a uno de los métodos FirebaseAuth.signInWith. Por ejemplo, obtén el token de ID de Google, el token de acceso de Facebook o el correo electrónico y la contraseña del usuario.
  3. Obtén una AuthCredential para el proveedor de autenticación nuevo:

    Acceso con Google

    Java

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

    Kotlin

    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)
    Acceso con Facebook

    Java

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

    Kotlin

    val credential = FacebookAuthProvider.getCredential(token.token)
    Acceso con correo electrónico y contraseña

    Java

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

    Kotlin

    val credential = EmailAuthProvider.getCredential(email, password)
  4. Pasa el objeto AuthCredential al método linkWithCredential del usuario que accedió:

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

    La llamada a linkWithCredential fallará si las credenciales ya se vincularon con la cuenta de otro usuario. En esta situación, debes administrar la fusión de las cuentas y los datos asociados según corresponda para la app:

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

Si la llamada a linkWithCredential se hace correctamente, el usuario podrá acceder con cualquier proveedor de autenticación vinculado para usar los mismos datos en Firebase.

Desvincula un proveedor de autenticación de una cuenta de usuario

Puedes desvincular un proveedor de autenticación de una cuenta, de forma que el usuario ya no pueda acceder con ese proveedor.

Para desvincular un proveedor de autenticación de una cuenta de usuario, pasa el ID del proveedor al método unlink. Para obtener los ID de los proveedores de autenticación vinculados a un usuario, puedes llamar a 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
                // ...
            }
        }