Mengambil kredensial yang disimpan pengguna

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

Sebelum memulai

Mengonfigurasi project Android Studio.

Membuat objek CredentialsClient

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

CredentialsClient mCredentialsClient;

// ...

mCredentialsApiClient = Credentials.getClient(this);

Membuat objek CredentialRequest

Objek CredentialRequest menentukan sistem {i>login<i} yang menjadi tempat Anda ingin meminta kredensial. Buat CredentialRequest menggunakan metode setPasswordLoginSupported untuk login berbasis sandi, dan metode setAccountTypes() untuk layanan login seperti Login dengan Google.

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

Menggunakan konstanta yang ditentukan dalam IdentityProviders untuk menentukan penyedia login yang biasa digunakan. Untuk penyedia login lainnya, gunakan salah satu yang mengidentifikasi penyedia secara unik. Anda harus menggunakan ID penyedia yang sama untuk menyimpan kredensial yang Anda gunakan untuk mengambil kredensial itu.

Meminta kredensial yang disimpan

Setelah Anda membuat objek CredentialsClient dan CredentialRequest, teruskan objek permintaan ke 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 kredensial yang Credential untuk menyelesaikan proses login pengguna ke aplikasi Anda. Menggunakan metode getAccountType() untuk menentukan jenis kredensial yang diambil, lalu menyelesaikan proses login yang sesuai {i>checkout<i}. Misalnya, untuk Login dengan Google, buat objek GoogleSignInClient yang menyertakan ID pengguna, lalu menggunakan objek tersebut untuk memulai alur login. Untuk aplikasi berbasis sandi login, gunakan ID dan sandi pengguna dari objek Credential untuk menyelesaikan proses login aplikasi proses login.

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 yang disimpan

Pemilih akun Smart Lock

Ketika input pengguna diperlukan untuk memilih kredensial, tugas request() akan gagal dengan ResolvableApiException. Pastikan bahwa getStatusCode() menampilkan RESOLUTION_REQUIRED dan panggil metode startResolutionForResult() pengecualian untuk meminta izin pengguna untuk memilih akun. Kemudian, ambil kredensial yang dipilih pengguna dari metode onActivityResult() aktivitas dengan meneruskan Credential.EXTRA_KEY ke elemen 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 tersimpan tidak ditemukan, pengguna harus membuat akun atau secara manual login. Jika getStatusCode() akan menampilkan SIGN_IN_REQUIRED, Anda juga dapat mempercepat proses pendaftaran dan login dengan meminta untuk memilih informasi masuk yang terakhir digunakan, seperti alamat email dan nama Anda, dan secara otomatis mengisi beberapa kolom formulir dengan informasi tersebut. Lihat Memberikan petunjuk login kepada pengguna untuk mengetahui detailnya.

Jika berhasil login, izinkan pengguna menyimpan kredensial mereka untuk mengotomatisasi otentikasi masa depan di semua perangkat mereka.