Pobieranie zapisanych danych logowania użytkownika

Automatycznie loguj użytkowników w aplikacji za pomocą interfejsu Credentials API do wysyłania żądań i odzyskiwanie zapisanych danych logowania użytkowników.

Zanim zaczniesz

Skonfiguruj projekt Android Studio.

Tworzenie obiektu CredentialsClient

Aby zażądać zapisanych danych logowania, musisz utworzyć instancję CredentialsClient, aby uzyskać dostęp do interfejsu Credentials API:

CredentialsClient mCredentialsClient;

// ...

mCredentialsApiClient = Credentials.getClient(this);

Tworzenie obiektu CredentialRequest

Obiekt CredentialRequest określa wartość systemów logowania, do których chcesz żądać danych logowania. Utwórz CredentialRequest za pomocą metody setPasswordLoginSupported do logowanie oparte na haśle oraz metoda setAccountTypes() w przypadku sfederowanego usług logowania, takich jak Logowanie przez Google.

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

Użyj stałych określonych w polu IdentityProviders. , aby określić często wybieranych dostawców logowania. W przypadku innych dostawców logowania użyj dowolnej ciąg jednoznacznie identyfikujący dostawcę. Musisz użyć tego samego identyfikatora dostawcy do przechowywania danych logowania używanych do ich pobierania.

Żądanie zapisanych danych logowania

Po utworzeniu obiektów CredentialsClient i CredentialRequest przekaż obiekt żądania do: CredentialsClient.request() żądania danych logowania przechowywanych dla aplikacji.

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

Zdefiniuj wywołanie zwrotne do obsługi udanych i nieudanych żądań za pomocą funkcji Metoda addOnCompleteListener().

Obsługa udanych żądań danych logowania

Toast informujący o pomyślnym zalogowaniu W przypadku udanego żądania danych logowania użyj wynikowego Credential. do ukończenia logowania użytkownika w aplikacji. Użyj metody getAccountType() w celu określenia typu pobranych danych logowania, a następnie zaloguj się proces tworzenia konta. Na przykład w przypadku Logowania przez Google utwórz obiekt GoogleSignInClient, który zawiera identyfikator użytkownika, a następnie użyj obiektu, aby rozpocząć proces logowania. Uwierzytelnianie oparte na haśle logowania, użyj identyfikatora użytkownika i hasła z obiektu Credential, aby logowania się.

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

Obsługa wielu zapisanych danych logowania

Wybieranie konta przy użyciu Smart Lock

Gdy dane logowania wymagają danych wejściowych użytkownika, zadanie request() zakończy się niepowodzeniem (ResolvableApiException). Sprawdź, czy getStatusCode() zwraca RESOLUTION_REQUIRED i wywołaj metodę startResolutionForResult() wyjątku, aby poprosić użytkownika aby wybrać konto. Następnie pobierz wybrane przez użytkownika dane logowania z metody onActivityResult() aktywności, przekazując Credential.EXTRA_KEY do funkcji 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();
        }
    }

    // ...

}

Jeśli zapisane dane logowania nie zostaną znalezione, użytkownicy muszą utworzyć konto lub ręcznie zaloguj się. Jeśli getStatusCode() zwraca SIGN_IN_REQUIRED, możesz opcjonalnie przyspieszyć proces rejestracji i logowania, prosząc o użytkownik może wybrać ostatnio używane dane logowania, takie jak adres e-mail i automatycznie wypełniać niektóre pola tymi informacjami. Zapoznaj się z sekcją Przekazywanie użytkownikowi wskazówek dotyczących logowania. .

Zezwalaj użytkownikom na zapisywanie danych logowania po zalogowaniu się automatyzacji przyszłego uwierzytelniania na wszystkich swoich urządzeniach.