Recuperare le credenziali memorizzate di un utente

Consenti agli utenti di accedere automaticamente alla tua app utilizzando l'API Credentials per richiedere e recuperare le credenziali archiviate per gli utenti.

Prima di iniziare

Configura un progetto Android Studio.

Crea un oggetto CredentialsClient

Per richiedere credenziali archiviate, devi creare un'istanza di CredentialsClient per accedere all'API Credentials:

CredentialsClient mCredentialsClient;

// ...

mCredentialsApiClient = Credentials.getClient(this);

Crea un oggetto CredentialRequest

Un oggetto CredentialRequest specifica i sistemi di accesso da cui vuoi richiedere le credenziali. Crea un CredentialRequest utilizzando il metodo setPasswordLoginSupported per l'accesso basato su password e il metodo setAccountTypes() per i servizi di accesso federato come Accedi con Google.

mCredentialRequest = new CredentialRequest.Builder()
    .setPasswordLoginSupported(true)
    .setAccountTypes(IdentityProviders.GOOGLE, IdentityProviders.TWITTER)
    .build();

Utilizza le costanti definite in IdentityProviders per specificare provider di accesso di uso comune. Per altri provider di accesso, utilizza qualsiasi stringa che identifichi il provider in modo univoco. Devi usare lo stesso identificatore del provider per archiviare le credenziali che usi per recuperarle.

Richiedi credenziali archiviate

Dopo aver creato gli oggetti CredentialsClient e CredentialRequest, passa l'oggetto di richiesta al metodo CredentialsClient.request() per richiedere le credenziali archiviate per la tua app.

  mCredentialsClient.request(mCredentialRequest).addOnCompleteListener(
      new OnCompleteListener<CredentialRequestResponse>() {
          @Override
          public void onComplete(@NonNull Task<CredentialRequestResponse> task) {

              if (task.isSuccessful()) {
                  // See "Handle successful credential requests"
                  onCredentialRetrieved(task.getResult().getCredential());
                  return;
              }

              // See "Handle unsuccessful and incomplete credential requests"
              // ...
          }
      });

Definisci un callback per gestire le richieste riuscite e non riuscite utilizzando il metodo addOnCompleteListener().

Gestire le richieste di credenziali riuscite

Messaggio popup che indica un accesso riuscito In caso di esito positivo della richiesta di credenziali, utilizza l'oggetto Credential risultante per completare l'accesso dell'utente alla tua app. Utilizza il metodo getAccountType() per determinare il tipo di credenziali recuperate, quindi completa la procedura di accesso appropriata. Ad esempio, per Accedi con Google, crea un oggetto GoogleSignInClient che includa l'ID dell'utente, quindi utilizza l'oggetto per avviare il flusso di accesso. Per l'accesso basato su password, utilizza l'ID utente e la password dell'oggetto Credenziali per completare la procedura di accesso della tua app.

private void onCredentialRetrieved(Credential credential) {
    String accountType = credential.getAccountType();
    if (accountType == null) {
        // Sign the user in with information from the Credential.
        signInWithPassword(credential.getId(), credential.getPassword());
    } else if (accountType.equals(IdentityProviders.GOOGLE)) {
        // The user has previously signed in with Google Sign-In. Silently
        // sign in the user with the same ID.
        // See https://developers.google.com/identity/sign-in/android/
        GoogleSignInOptions gso =
                new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                        .requestEmail()
                        .build();

        GoogleSignInClient signInClient = GoogleSignIn.getClient(this, gso);
        Task<GoogleSignInAccount> task = signInClient.silentSignIn();
        // ...
    }
}

Gestire più credenziali salvate

Selettore account Smart Lock

Quando è richiesto l'input utente per selezionare una credenziale, l'attività request() non andrà a buon fine con un elemento ResolvableApiException. Verifica che getStatusCode() restituisca RESOLUTION_REQUIRED e chiami il metodo startResolutionForResult() dell'eccezione per richiedere all'utente di scegliere un account. Quindi, recupera le credenziali scelte dall'utente dal metodo onActivityResult() dell'attività passando Credential.EXTRA_KEY al metodo getParcelableExtra().

mCredentialsClient.request(request).addOnCompleteListener(
        new OnCompleteListener() {
            @Override
            public void onComplete(@NonNull Task task) {
                if (task.isSuccessful()) {
                    // ...
                    return;
                }

                Exception e = task.getException();
                if (e instanceof ResolvableApiException) {
                    // This is most likely the case where the user has multiple saved
                    // credentials and needs to pick one. This requires showing UI to
                    // resolve the read request.
                    ResolvableApiException rae = (ResolvableApiException) e;
                    resolveResult(rae, RC_READ);
                } else if (e instanceof ApiException) {
                    // The user must create an account or sign in manually.
                    Log.e(TAG, "Unsuccessful credential request.", e);

                    ApiException ae = (ApiException) e;
                    int code = ae.getStatusCode();
                    // ...
                }
            }
        });
private void resolveResult(ResolvableApiException rae, int requestCode) {
    try {
        rae.startResolutionForResult(MainActivity.this, requestCode);
        mIsResolving = true;
    } catch (IntentSender.SendIntentException e) {
        Log.e(TAG, "Failed to send resolution.", e);
        hideProgress();
    }
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    // ...

    if (requestCode == RC_READ) {
        if (resultCode == RESULT_OK) {
            Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
            onCredentialRetrieved(credential);
        } else {
            Log.e(TAG, "Credential Read: NOT OK");
            Toast.makeText(this, "Credential Read Failed", Toast.LENGTH_SHORT).show();
        }
    }

    // ...

}

Se non vengono trovate le credenziali archiviate, gli utenti devono creare un account o accedere manualmente. Se getStatusCode() restituisce SIGN_IN_REQUIRED, se vuoi, puoi velocizzare la procedura di registrazione e accesso chiedendo all'utente di scegliere i dati di accesso utilizzati di recente, come indirizzo email e nome, e di compilare automaticamente alcuni campi dei moduli con queste informazioni. Per maggiori dettagli, vedi Fornire suggerimenti di accesso a un utente.

Una volta eseguito l'accesso, consenti agli utenti di salvare le proprie credenziali per automatizzare l'autenticazione futura su tutti i loro dispositivi.