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 le 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 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 gli account di accesso a servizi come Accedi con Google.

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

Utilizza le costanti definite in IdentityProviders per specificare i provider di accesso di uso comune. Per gli altri provider di accesso, utilizza qualsiasi che identifica in modo univoco il provider. Devi utilizzare lo stesso identificatore del provider per archiviare le credenziali mentre le utilizzi.

Richiedi credenziali archiviate

Dopo aver creato gli oggetti CredentialsClient e CredentialRequest, passa l'oggetto di richiesta alle 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 una richiesta di credenziali andata a buon fine, utilizza Credential per completare l'accesso dell'utente alla tua app. Utilizza il metodo getAccountType() per determinare il tipo di credenziali recuperate, quindi completa le credenziali di accesso e il processo di sviluppo. Ad esempio, per Accedi con Google, crea un oggetto GoogleSignInClient che include l'ID utente, quindi utilizza l'oggetto per avviare il flusso di accesso. Per password accedi, utilizza l'ID utente e la password dell'oggetto Credential per completare la procedura di accesso.

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 è necessario l'input dell'utente per selezionare una credenziale, l'attività request() con un errore ResolvableApiException. Verifica che getStatusCode() restituisce RESOLUTION_REQUIRED e chiama il metodo startResolutionForResult() dell'eccezione per chiedere all'utente per scegliere un account. Quindi, recupera le credenziali scelte dall'utente dal il metodo onActivityResult() dell'attività passando Credential.EXTRA_KEY al 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 memorizzate, gli utenti devono creare un account oppure eseguire accedi. Se getStatusCode() restituisce SIGN_IN_REQUIRED, puoi anche velocizzare le procedure di registrazione e accesso richiedendo il all'utente di scegliere le informazioni di accesso utilizzate di recente, come indirizzo email e e compilando automaticamente alcuni campi dei moduli con quelle informazioni. Vedi Fornire suggerimenti di accesso a un utente. per maggiori dettagli.

All'accesso riuscito, consenti agli utenti di salvare le proprie credenziali per automatizzare le autenticazioni future su tutti i loro dispositivi.