Se o login do One Tap atender às suas necessidades, considere usá-lo. One Tap tem uma experiência de usuário atualizada e outras melhorias.

Recuperar as credenciais armazenadas de um usuário

Faça login automático dos usuários no seu 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, crie uma instância de CredentialsClient para acessar a API Credentials:

CredentialsClient mCredentialsClient;

// ...

mCredentialsApiClient = Credentials.getClient(this);

Criar um objeto CredentialRequest

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

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

Use as constantes definidas em IdentityProviders para especificar os provedores de login mais usados. Para outros provedores de login, use qualquer string que identifique o provedor de forma exclusiva. Use o mesmo identificador de provedor para armazenar as credenciais que você usa para recuperar as credenciais.

Solicitar credenciais armazenadas

Depois de criar objetos CredentialsClient e CredentialRequest, transmita o objeto de solicitação ao método 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 processar solicitações bem-sucedidas e com falha usando o método addOnCompleteListener().

Processar solicitações de credenciais bem-sucedidas

Notificação que indica um login bem-sucedido Em uma solicitação de credenciais bem-sucedida, use o objeto resultante Credential para concluir o login do usuário no seu app. Use o método getAccountType() para determinar o tipo de credenciais recuperadas e conclua o processo de login adequado. Por exemplo, para o Login do Google, crie um objeto GoogleSignInClient que inclua o ID do usuário e use o objeto para iniciar o fluxo de login. Para fazer login com base em senha, use o ID e a senha do usuário do objeto do Credential para concluir o processo de login do seu aplicativo.

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 a entrada do usuário é necessária para selecionar uma credencial, a tarefa request() falhará com um ResolvableApiException. Verifique se getStatusCode() retorna RESOLUTION_REQUIRED e chame o método startResolutionForResult() da exceção para solicitar que o usuário escolha uma conta. Em seguida, recupere as credenciais escolhidas do usuário do método onActivityResult() transmitindo Credential.EXTRA_KEY para o método 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 fazer login manualmente. Se getStatusCode() retornar SIGN_IN_REQUIRED, é possível acelerar os processos de inscrição e login solicitando que o usuário escolha as informações de login usadas recentemente, como endereço de e-mail e nome, e preencha automaticamente alguns campos dos formulários com essas informações. Consulte Exibir dicas de login para um usuário para mais detalhes.

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