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