Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Vincular múltiples proveedores de autenticación a una cuenta en Android

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

Puede permitir que los usuarios inicien sesión en su aplicación utilizando varios proveedores de autenticación vinculando las credenciales del proveedor de autenticación a una cuenta de usuario existente. Los usuarios son identificables por el mismo ID de usuario de Firebase independientemente del proveedor de autenticación que usaron para iniciar sesión. Por ejemplo, un usuario que inició sesión con una contraseña puede vincular una cuenta de Google e iniciar sesión con cualquier método en el futuro. O bien, un usuario anónimo puede vincular una cuenta de Facebook y luego, luego, iniciar sesión con Facebook para continuar usando su aplicación.

Antes de que empieces

Agregue soporte para dos o más proveedores de autenticación (posiblemente incluida la autenticación anónima) a su aplicación.

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

  1. Inicie sesión con el usuario mediante cualquier proveedor o método de autenticación.
  2. Complete el flujo de inicio de sesión para el nuevo proveedor de autenticación hasta, pero sin incluir, llamar a uno de los métodos FirebaseAuth.signInWith . Por ejemplo, obtenga el token de ID de Google del usuario, el token de acceso de Facebook o el correo electrónico y la contraseña.
  3. Obtenga una AuthCredential para el nuevo proveedor de autenticación:

    Inicio de sesión de Google

    Java

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

    Kotlin+KTX

    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)
    Inicio de sesión en Facebook

    Java

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

    Kotlin+KTX

    val credential = FacebookAuthProvider.getCredential(token.token)
    Inicio de sesión con contraseña de correo electrónico

    Java

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

    Kotlin+KTX

    val credential = EmailAuthProvider.getCredential(email, password)
  4. Pase el objeto AuthCredential al método linkWithCredential del usuario que ha iniciado sesión:

    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+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)
                }
            }

    La llamada a linkWithCredential fallará si las credenciales ya están vinculadas a otra cuenta de usuario. En esta situación, debe manejar la fusión de las cuentas y los datos asociados según corresponda para su aplicación:

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

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

Si la llamada a linkWithCredential tiene éxito, el usuario ahora puede iniciar sesión con cualquier proveedor de autenticación vinculado y acceder a los mismos datos de Firebase.

Puede desvincular un proveedor de autenticación de una cuenta para que el usuario ya no pueda iniciar sesión con ese proveedor.

Para desvincular un proveedor de autenticación de una cuenta de usuario, pase la ID del proveedor al método de unlink . Puede obtener los ID de proveedor de los proveedores de autenticación vinculados a un usuario llamando 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+KTX

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