Google 致力于为黑人社区推动种族平等。查看具体举措
此页面由 Cloud Translation API 翻译。
Switch to English

Collega 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 dallo 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 entrambi i metodi in futuro. In alternativa, un utente anonimo può collegare un account Facebook e quindi, 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 (possibilmente inclusa l'autenticazione anonima) alla tua app.

Per collegare le credenziali del provider 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 a, ma non incluso, chiamando uno dei metodi FirebaseAuth.signInWith . Ad esempio, ottieni il token ID Google dell'utente, il token di accesso a Facebook o l'email e la password.
  3. Ottieni un AuthCredential per il nuovo provider di autenticazione:

    Accesso a Google

    Giava

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

    Kotlin + KTX

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

    Giava

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

    Kotlin + KTX

    val credential = FacebookAuthProvider.getCredential(token.token)
    Accesso tramite e-mail con password

    Giava

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

    Kotlin + KTX

    val credential = EmailAuthProvider.getCredential(email, password)
  4. Passare l'oggetto AuthCredential al metodo linkWithCredential dell'utente linkWithCredential :

    Giava

    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 chiamata a linkWithCredential fallirà se le credenziali sono già collegate a un altro account utente. In questa situazione, devi gestire l'unione degli account e dei dati associati come appropriato per la tua app:

    Giava

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

Se la chiamata a linkWithCredential riesce, l'utente ora può 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, passare l'ID del provider al metodo di unlink . È possibile ottenere gli ID provider dei provider di autenticazione collegati a un utente chiamando getProviderData .

Giava

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