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
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
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.