Mengambil kredensial yang disimpan pengguna

Buat pengguna login secara otomatis ke aplikasi Anda menggunakan Credentials API untuk meminta dan mengambil kredensial yang disimpan untuk pengguna.

Sebelum memulai

Mengonfigurasi project Android Studio.

Membuat objek CredentialsClient

Untuk meminta kredensial yang tersimpan, Anda harus membuat instance CredentialsClient untuk mengakses Credentials API:

CredentialsClient mCredentialsClient;

// ...

mCredentialsApiClient = Credentials.getClient(this);

Membuat objek CredentialRequest

Objek CredentialRequest menentukan sistem login tempat Anda ingin meminta kredensial. Buat CredentialRequest menggunakan metode setPasswordLoginSupported untuk login berbasis sandi, dan metode setAccountTypes() untuk layanan login gabungan seperti Login dengan Google.

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

Gunakan konstanta yang ditentukan dalam IdentityProviders untuk menentukan penyedia login yang biasa digunakan. Untuk penyedia login lainnya, gunakan string apa pun yang mengidentifikasi penyedia secara unik. Anda harus menggunakan ID penyedia yang sama untuk menyimpan kredensial seperti yang Anda gunakan untuk mengambil kredensial.

Meminta kredensial yang disimpan

Setelah membuat objek CredentialsClient dan CredentialRequest, teruskan objek permintaan ke metode CredentialsClient.request() untuk meminta kredensial yang disimpan untuk aplikasi Anda.

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

Tentukan callback untuk menangani permintaan yang berhasil dan gagal menggunakan metode addOnCompleteListener().

Menangani permintaan kredensial yang berhasil

Toast yang menunjukkan login berhasil Pada permintaan kredensial yang berhasil, gunakan objek Credential yang dihasilkan untuk menyelesaikan login pengguna ke aplikasi Anda. Gunakan metode getAccountType() untuk menentukan jenis kredensial yang diambil, lalu selesaikan proses login yang sesuai. Misalnya, untuk Login dengan Google, buat objek GoogleSignInClient yang menyertakan ID pengguna, lalu gunakan objek tersebut untuk memulai alur login. Untuk login berbasis sandi, gunakan ID dan sandi pengguna dari objek Kredensial untuk menyelesaikan proses login aplikasi Anda.

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

Menangani beberapa kredensial tersimpan

Pemilih akun Smart Lock

Jika input pengguna diperlukan untuk memilih kredensial, tugas request() akan gagal dengan ResolvableApiException. Pastikan getStatusCode() menampilkan RESOLUTION_REQUIRED dan panggil metode startResolutionForResult() pengecualian untuk meminta pengguna memilih akun. Selanjutnya, ambil kredensial yang dipilih pengguna dari metode onActivityResult() aktivitas dengan meneruskan Credential.EXTRA_KEY ke metode 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();
        }
    }

    // ...

}

Jika kredensial yang disimpan tidak ditemukan, pengguna harus membuat akun atau login secara manual. Jika getStatusCode() menampilkan SIGN_IN_REQUIRED, Anda dapat mempercepat proses pendaftaran dan login dengan meminta pengguna memilih informasi login yang baru saja digunakan, seperti alamat email dan nama, dan otomatis mengisi beberapa kolom formulir dengan informasi tersebut. Lihat Memberikan petunjuk login kepada pengguna untuk mengetahui detailnya.

Jika berhasil login, izinkan pengguna untuk menyimpan kredensial mereka untuk mengotomatiskan autentikasi mendatang di semua perangkat mereka.