Collegare più provider di autenticazione a un account su Android

Puoi consentire agli utenti di accedere alla tua app utilizzando più provider di autenticazione collegando le credenziali del provider di autenticazione a un account utente esistente. Gli utenti sono identificabili con lo stesso ID utente Firebase indipendentemente dal provider di autenticazione utilizzato per accedere. Ad esempio, un utente che ha eseguito l'accesso con una password può collegare un Account Google e accedere con uno dei due metodi in futuro. In alternativa, un utente anonimo può collegare un account Facebook e, in un secondo momento, accedere con Facebook per continuare a utilizzare la tua app.

Prima di iniziare

Aggiungi il supporto per due o più provider di autenticazione (inclusa eventualmente l'autenticazione anonima) alla tua app.

Per collegare le credenziali del fornitore di autenticazione a un account utente esistente:

  1. Accedi all'utente utilizzando qualsiasi provider o metodo di autenticazione.
  2. Completa il flusso di accesso per il nuovo provider di autenticazione fino alla chiamata di uno dei metodi FirebaseAuth.signInWith, ma non inclusa. Ad esempio, ottieni il token ID Google, il token di accesso Facebook o l'email e la password dell'utente.
  3. Ottieni un AuthCredential per il nuovo provider di autenticazione:

    Accedi con Google

    Kotlin

    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)

    Java

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

    Kotlin

    val credential = FacebookAuthProvider.getCredential(token.token)

    Java

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    Accesso con email e password

    Kotlin

    val credential = EmailAuthProvider.getCredential(email, password)

    Java

    AuthCredential credential = EmailAuthProvider.getCredential(email, password);
  4. Passa l'oggetto AuthCredential al metodo linkWithCredential dell'utente che ha eseguito l'accesso:

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

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

    La chiamata a linkWithCredential non andrà a buon fine se le credenziali sono già collegate a un altro account utente. In questa situazione, devi gestire l'unione degli account e dei dati associati in modo appropriato per la tua app:

    Kotlin

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

Se la chiamata a linkWithCredential va a buon fine, l'utente può ora accedere utilizzando qualsiasi provider di autenticazione collegato e accedere agli stessi dati Firebase.

Puoi scollegare un provider di autenticazione da un account, in modo che l'utente non possa più accedere con quel provider.

Per scollegare un provider di autenticazione da un account utente, trasmetti l'ID provider al metodo unlink. Puoi ottenere gli ID dei provider di autenticazione collegati a un utente chiamando getProviderData.

Kotlin

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

Risoluzione dei problemi

Se si verificano errori durante il tentativo di collegare più account, consulta la documentazione sugli indirizzi email verificati.