Pobieranie zapisanych danych logowania użytkownika

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

Zanim zaczniesz

Skonfiguruj projekt Android Studio.

Tworzenie obiektu CredentialsClient

Aby zażądać przechowywanych danych logowania, musisz utworzyć instancję CredentialsClient w celu uzyskania dostępu do interfejsu Credentials API:

CredentialsClient mCredentialsClient;

// ...

mCredentialsApiClient = Credentials.getClient(this);

Tworzenie obiektu CredentialRequest

Obiekt CredentialRequest określa systemy logowania, do których chcesz zażądać danych logowania. Utwórz CredentialRequest za pomocą metody setPasswordLoginSupported do logowania opartego na haśle i metody setAccountTypes() na potrzeby sfederowanych usług logowania, takich jak Logowanie przez Google.

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

Aby określić często wybieranych dostawców logowania, użyj stałych określonych w polu IdentityProviders. W przypadku innych dostawców logowania użyj dowolnego ciągu, który jednoznacznie identyfikuje dostawcę. Do przechowywania danych logowania musisz używać tego samego identyfikatora dostawcy.

Poproś o zapisane dane logowania

Po utworzeniu obiektów CredentialsClient i CredentialRequest przekaż obiekt żądania do metody CredentialsClient.request(), aby zażądać danych logowania zapisanych w 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"
              // ...
          }
      });

Określ wywołanie zwrotne do obsługi udanych i nieudanych żądań za pomocą metody addOnCompleteListener().

Obsługa udanych żądań danych logowania

Toast informujący o pomyślnym zalogowaniu Po pomyślnym żądaniu danych logowania użyj wynikowego obiektu Credential, aby dokończyć logowanie użytkownika w aplikacji. Użyj metody getAccountType(), aby określić typ pobranych danych logowania, a następnie przejdź odpowiedni proces logowania. Na przykład w przypadku logowania przez Google utwórz obiekt GoogleSignInClient zawierający identyfikator użytkownika, a następnie użyj go do uruchomienia procesu logowania. W przypadku logowania opartego na haśle dokończ proces logowania się w aplikacji, używając identyfikatora i hasła użytkownika z obiektu 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();
        // ...
    }
}

Obsługa wielu zapisanych danych logowania

Smart Lock – wybór konta

Jeśli do wybrania danych logowania wymagane jest wprowadzenie danych wejściowych użytkownika, zadanie request() zakończy się błędem ResolvableApiException. Sprawdź, czy getStatusCode() zwraca wartość RESOLUTION_REQUIRED, i wywołuj metodę startResolutionForResult() wyjątku, aby prosić użytkownika o wybranie konta. Następnie pobierz wybrane przez użytkownika dane logowania za pomocą metody onActivityResult() aktywności, przekazując Credential.EXTRA_KEY do metody 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 będą musieli utworzyć konto lub zalogować się ręcznie. Jeśli getStatusCode() zwraca SIGN_IN_REQUIRED, możesz opcjonalnie przyspieszyć proces rejestracji i logowania, prosząc użytkownika o wybranie ostatnio używanych danych logowania, takich jak adres e-mail i imię i nazwisko, oraz automatycznie wypełnij niektóre pola formularzy tymi informacjami. Więcej informacji znajdziesz w sekcji Udostępnianie użytkownikowi wskazówek dotyczących logowania.

Po zalogowaniu się zezwalaj użytkownikom na zapisywanie swoich danych logowania, aby zautomatyzować przyszłe uwierzytelnianie na wszystkich urządzeniach.