Recuperar as credenciais armazenadas de um usuário

Faça login dos usuários automaticamente no app usando a API Credentials para solicitar e recuperar credenciais armazenadas para seus usuários.

Antes de começar

Configure um projeto do Android Studio.

Criar um objeto CredentialsClient

Para solicitar credenciais armazenadas, você deve criar uma instância de CredentialsClient para acessar a API Credentials:

CredentialsClient mCredentialsClient;

// ...

mCredentialsApiClient = Credentials.getClient(this);

Criar um objeto CredentialRequest

Um objeto CredentialRequest especifica o sistemas de login dos quais você quer solicitar credenciais. Crie um CredentialRequest usando o método setPasswordLoginSupported para login baseado em senha e o método setAccountTypes() para registros serviços de login, como o Login do Google.

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

Usar as constantes definidas em IdentityProviders para especificar os provedores de login mais usados. Para outros provedores de login, use qualquer string que identifica exclusivamente o provedor. Use o mesmo identificador de provedor para armazenar as credenciais enquanto você as usa para recuperá-las.

Solicitar credenciais armazenadas

Depois de criar os objetos CredentialsClient e CredentialRequest, transmita o objeto da solicitação. para o CredentialsClient.request() para solicitar credenciais armazenadas para seu 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"
              // ...
          }
      });

Defina um callback para lidar com solicitações bem-sucedidas e com falha usando o addOnCompleteListener().

Processar solicitações de credenciais bem-sucedidas

Aviso indicando um login concluído Em uma solicitação de credencial bem-sucedida, use o Credential para concluir o login do usuário no seu app. Usar o método getAccountType() para determinar o tipo de credenciais recuperadas e faça o login de desenvolvimento de software. Por exemplo, para o Login do Google, crie um objeto GoogleSignInClient que incluir o ID do usuário e, em seguida, usar o objeto para iniciar o fluxo de login. Para senhas login, use o ID e a senha do usuário do objeto Credential para concluir a processo de login.

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

Processar várias credenciais salvas

Seletor de conta do Smart Lock

Quando o usuário precisar inserir uma credencial para selecionar uma credencial, a tarefa request() vai falhar com um ResolvableApiException. Verifique se getStatusCode() retorna RESOLUTION_REQUIRED e chamar o método startResolutionForResult() da exceção para solicitar que o usuário para escolher uma conta. Em seguida, recupere as credenciais escolhidas pelo usuário no método onActivityResult() da atividade transmitindo Credential.EXTRA_KEY para o 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();
        }
    }

    // ...

}

Quando as credenciais armazenadas não são encontradas, os usuários precisam criar uma conta ou criar fazer login. Se getStatusCode() retorna SIGN_IN_REQUIRED, você pode, opcionalmente, acelerar os processos de inscrição e login solicitando que que o usuário escolha informações de login usadas recentemente, como endereço de e-mail e e preenchendo automaticamente alguns campos dos formulários com essas informações. Consulte Dar dicas de login para um usuário. para mais detalhes.

Após o login, permitir que os usuários salvem as credenciais para automatizar a autenticação futura em todos os dispositivos.