Получить сохраненные учетные данные пользователя

Автоматически регистрируйте пользователей в своем приложении, используя Credentials API для запроса и получения сохраненных учетных данных для ваших пользователей.

Прежде чем вы начнете

Настройте проект Android Studio .

Создайте объект CredentialsClient.

Чтобы запросить сохраненные учетные данные, вы должны создать экземпляр CredentialsClient для доступа к Credentials API:

CredentialsClient mCredentialsClient;

// ...

mCredentialsApiClient = Credentials.getClient(this);

Создайте объект CredentialRequest.

Объект CredentialRequest указывает системы входа, из которых вы хотите запросить учетные данные. Создайте CredentialRequest , используя метод setPasswordLoginSupported для входа на основе пароля и метод setAccountTypes() для федеративных служб входа, таких как Google Sign-In.

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

Используйте константы, определенные в IdentityProviders , чтобы указать часто используемые поставщики входа. Для других поставщиков входа используйте любую строку, которая однозначно идентифицирует поставщика. Для хранения учетных данных необходимо использовать тот же идентификатор поставщика, который вы используете для получения учетных данных.

Запросить сохраненные учетные данные

После создания объектов CredentialsClient и CredentialRequest передайте объект запроса методу CredentialsClient.request() , чтобы запросить учетные данные, хранящиеся для вашего приложения.

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

Определите обратный вызов для обработки успешных и неудачных запросов с помощью метода addOnCompleteListener() .

Обработка успешных запросов учетных данных

Тост, указывающий на успешный вход в систему При успешном запросе учетных данных используйте полученный объект Credential для завершения входа пользователя в ваше приложение. Используйте метод getAccountType() , чтобы определить тип полученных учетных данных, а затем завершите соответствующий процесс входа. Например, для входа в Google создайте объект GoogleSignInClient , включающий идентификатор пользователя, а затем используйте этот объект для запуска процесса входа. Для входа на основе пароля используйте идентификатор пользователя и пароль из объекта Credential, чтобы завершить процесс входа в приложение.

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

Обработка нескольких сохраненных учетных данных

Выбор учетной записи Smart Lock

Если для выбора учетных данных требуется ввод данных пользователем, задача request() завершится с ошибкой ResolvableApiException . Убедитесь, что getStatusCode() возвращает RESOLUTION_REQUIRED , и вызовите метод startResolutionForResult() исключения, чтобы предложить пользователю выбрать учетную запись. Затем получите выбранные пользователем учетные данные из метода onActivityResult() действия, передав Credential.EXTRA_KEY методу 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();
        }
    }

    // ...

}

Если сохраненные учетные данные не найдены, пользователи должны создать учетную запись или войти в систему вручную. Если getStatusCode() возвращает SIGN_IN_REQUIRED , вы можете дополнительно ускорить процессы регистрации и входа, предложив пользователю выбрать недавно использованную информацию для входа. например адрес электронной почты и имя, и автоматическое заполнение некоторых полей форм этой информацией. Дополнительные сведения см. в разделе Предоставление пользователю подсказок по входу в систему.

При успешном входе разрешите пользователям сохранять свои учетные данные для автоматизации дальнейшей аутентификации на всех своих устройствах.