Jika Anda mendukung login dengan Akun Google, Anda dapat menggunakan klien login Sekali Ketuk untuk memberikan pengalaman pembuatan akun yang lancar kepada pengguna yang tidak pernah membuat mereka keluar dari konteks aplikasi Anda.
Saat Anda menampilkan UI Login Sekali Ketuk, pengguna akan diminta untuk membuat akun baru dengan aplikasi Anda menggunakan salah satu Akun Google di perangkat mereka. Jika pengguna memilih untuk melanjutkan, Anda akan mendapatkan token ID dengan informasi profil dasar—nama, foto profil, dan alamat email terverifikasi—yang dapat Anda gunakan untuk membuat akun baru.
Penerapan pembuatan akun Sekali Ketuk memiliki dua bagian:
- Mengintegrasikan klien Sekali Ketuk ke dalam aplikasi Anda, yang dijelaskan di halaman ini. Proses ini sebagian besar sama dengan menggunakan login Sekali Ketuk, tetapi dengan beberapa perbedaan dalam konfigurasi.
- Menambahkan kemampuan untuk membuat akun pengguna dari token ID Google ke backend Anda, yang dibahas dalam Menggunakan token ID di backend.
Di mana saya harus menggunakan pendaftaran Sekali Ketuk?
Tempat yang paling efektif untuk menawarkan login Sekali Ketuk kepada pengguna adalah dalam konteks saat login akan mengaktifkan fitur baru. Pertama, coba proses login pengguna dengan kredensial tersimpan. Jika tidak ada kredensial tersimpan yang ditemukan, tawarkan untuk membuat akun baru bagi pengguna.
Sebelum memulai
Siapkan project Konsol API Google dan project Android Anda seperti yang dijelaskan dalam Mulai menggunakan login sekali ketuk.
1. Mengonfigurasi klien One Tap
Untuk mengonfigurasi klien Login Sekali Ketuk untuk pembuatan akun, lakukan hal berikut:
- Jangan aktifkan permintaan kredensial sandi. (Pendaftaran sekali ketuk hanya dapat dilakukan dengan autentikasi berbasis token.)
Aktifkan permintaan token ID Google menggunakan
setGoogleIdTokenRequestOptions()dan setelan berikut:- Tetapkan ID klien server ke ID yang Anda buat di konsol Google API. Perhatikan bahwa ini adalah client ID server Anda, bukan client ID Android Anda.
- Konfigurasi klien untuk menampilkan semua Akun Google di perangkat—yaitu, jangan memfilter menurut akun yang diberi otorisasi.
- Secara opsional, Anda juga dapat meminta nomor telepon terverifikasi untuk akun tersebut.
Java
public class YourActivity extends AppCompatActivity { // ... private SignInClient oneTapClient; private BeginSignInRequest signUpRequest; @Override public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) { super.onCreate(savedInstanceState, persistentState); oneTapClient = Identity.getSignInClient(this); signUpRequest = BeginSignInRequest.builder() .setGoogleIdTokenRequestOptions(GoogleIdTokenRequestOptions.builder() .setSupported(true) // Your server's client ID, not your Android client ID. .setServerClientId(getString(R.string.your_web_client_id)) // Show all accounts on the device. .setFilterByAuthorizedAccounts(false) .build()) .build(); // ... } }
Kotlin
class YourActivity : AppCompatActivity() { // ... private lateinit var oneTapClient: SignInClient private lateinit var signUpRequest: BeginSignInRequest override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) oneTapClient = Identity.getSignInClient(this) signUpRequest = BeginSignInRequest.builder() .setGoogleIdTokenRequestOptions( BeginSignInRequest.GoogleIdTokenRequestOptions.builder() .setSupported(true) // Your server's client ID, not your Android client ID. .setServerClientId(getString(R.string.your_web_client_id)) // Show all accounts on the device. .setFilterByAuthorizedAccounts(false) .build()) .build() // ... } // ... }
2. Melacak pembatalan UI Login Sekali Ketuk
Anda harus melacak apakah pengguna telah menolak untuk menggunakan pendaftaran Sekali Ketuk dengan menutup dialog atau mengetuk di luar dialog. Hal ini bisa sesederhana properti boolean Activity Anda. (Lihat Berhenti menampilkan UI Sekali Ketuk di bawah.)
3. Menampilkan UI pendaftaran Sekali Ketuk
Jika pengguna belum menolak penggunaan Login Sekali Ketuk untuk membuat akun baru, panggil metode beginSignIn() objek klien, dan lampirkan pemroses ke Task yang ditampilkan. Aplikasi biasanya melakukan langkah ini saat permintaan login Sekali Ketuk tidak menemukan
kredensial tersimpan—yaitu, di pemroses kegagalan permintaan login.
Klien Login Sekali Ketuk akan memanggil pemroses keberhasilan jika pengguna telah menyiapkan satu atau beberapa Akun Google di perangkat. Di pemroses peristiwa sukses, dapatkan intent tertunda
dari hasil Task dan teruskan ke startIntentSenderForResult() untuk
memulai UI Login Sekali Ketuk.
Jika pengguna tidak memiliki Akun Google di perangkat, klien Login Sekali Ketuk akan memanggil pendengar kegagalan. Dalam hal ini, Anda tidak perlu melakukan tindakan apa pun: Anda dapat melanjutkan menampilkan pengalaman logout aplikasi, dan pengguna dapat mendaftar dengan alur pembuatan akun normal Anda.
Java
oneTapClient.beginSignIn(signUpRequest)
.addOnSuccessListener(this, new OnSuccessListener<BeginSignInResult>() {
@Override
public void onSuccess(BeginSignInResult result) {
try {
startIntentSenderForResult(
result.getPendingIntent().getIntentSender(), REQ_ONE_TAP,
null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "Couldn't start One Tap UI: " + e.getLocalizedMessage());
}
}
})
.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// No Google Accounts found. Just continue presenting the signed-out UI.
Log.d(TAG, e.getLocalizedMessage());
}
});
Kotlin
oneTapClient.beginSignIn(signUpRequest)
.addOnSuccessListener(this) { result ->
try {
startIntentSenderForResult(
result.pendingIntent.intentSender, REQ_ONE_TAP,
null, 0, 0, 0)
} catch (e: IntentSender.SendIntentException) {
Log.e(TAG, "Couldn't start One Tap UI: ${e.localizedMessage}")
}
}
.addOnFailureListener(this) { e ->
// No Google Accounts found. Just continue presenting the signed-out UI.
Log.d(TAG, e.localizedMessage)
}
4. Menangani respons pengguna
Respons pengguna terhadap dialog pendaftaran sekali ketuk akan dilaporkan ke aplikasi Anda menggunakan metode onActivityResult() Aktivitas Anda. Jika pengguna memilih untuk membuat akun, hasilnya adalah token ID Google. Jika pengguna menolak untuk mendaftar,
baik dengan menutup UI Login Sekali Ketuk atau mengetuk di luarnya, hasilnya akan ditampilkan
dengan kode RESULT_CANCELED. Aplikasi Anda harus menangani kedua kemungkinan tersebut.
Membuat akun dengan token ID Google
Jika pengguna memilih untuk mendaftar dengan Akun Google, Anda bisa mendapatkan token ID untuk pengguna tersebut dengan meneruskan data intent dari onActivityResult() ke metode getSignInCredentialFromIntent() klien Login Sekali Ketuk. Kredensial akan memiliki properti googleIdToken non-null.
Gunakan token ID untuk membuat akun di backend Anda (lihat Mengautentikasi dengan backend menggunakan token ID) dan login pengguna.
Kredensial juga berisi detail tambahan yang Anda minta, seperti nomor telepon terverifikasi akun jika tersedia.
Java
public class YourActivity extends AppCompatActivity { // ... private static final int REQ_ONE_TAP = 2; // Can be any integer unique to the Activity. private boolean showOneTapUI = true; // ... @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQ_ONE_TAP: try { SignInCredential credential = oneTapClient.getSignInCredentialFromIntent(data); String idToken = credential.getGoogleIdToken(); if (idToken != null) { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token."); } } catch (ApiException e) { // ... } break; } } }
Kotlin
class YourActivity : AppCompatActivity() { // ... private val REQ_ONE_TAP = 2 // Can be any integer unique to the Activity private var showOneTapUI = true // ... override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { REQ_ONE_TAP -> { try { val credential = oneTapClient.getSignInCredentialFromIntent(data) val idToken = credential.googleIdToken when { idToken != null -> { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token.") } else -> { // Shouldn't happen. Log.d(TAG, "No ID token!") } } } catch (e: ApiException) { // ... } } } // ... }
Berhenti menampilkan UI Login Sekali Ketuk
Jika pengguna menolak untuk login, panggilan ke getSignInCredentialFromIntent()
akan memunculkan ApiException dengan kode status CommonStatusCodes.CANCELED.
Jika hal ini terjadi, Anda harus menghentikan sementara tampilan UI login Sekali Ketuk
agar tidak mengganggu pengguna dengan perintah berulang. Contoh berikut
melakukannya dengan menetapkan properti di Aktivitas, yang digunakan untuk
menentukan apakah akan menawarkan login Sekali Ketuk kepada pengguna; namun, Anda juga dapat
menyimpan nilai ke SharedPreferences atau menggunakan metode lain.
Penting untuk menerapkan pembatasan kecepatan pada perintah login Sekali Ketuk Anda sendiri. Jika Anda tidak melakukannya, dan pengguna membatalkan beberapa perintah secara berurutan, klien Login Sekali Ketuk tidak akan meminta pengguna selama 24 jam berikutnya.
Java
public class YourActivity extends AppCompatActivity { // ... private static final int REQ_ONE_TAP = 2; // Can be any integer unique to the Activity. private boolean showOneTapUI = true; // ... @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQ_ONE_TAP: try { // ... } catch (ApiException e) { switch (e.getStatusCode()) { case CommonStatusCodes.CANCELED: Log.d(TAG, "One-tap dialog was closed."); // Don't re-prompt the user. showOneTapUI = false; break; case CommonStatusCodes.NETWORK_ERROR: Log.d(TAG, "One-tap encountered a network error."); // Try again or just ignore. break; default: Log.d(TAG, "Couldn't get credential from result." + e.getLocalizedMessage()); break; } } break; } } }
Kotlin
class YourActivity : AppCompatActivity() { // ... private val REQ_ONE_TAP = 2 // Can be any integer unique to the Activity private var showOneTapUI = true // ... override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { REQ_ONE_TAP -> { try { // ... } catch (e: ApiException) { when (e.statusCode) { CommonStatusCodes.CANCELED -> { Log.d(TAG, "One-tap dialog was closed.") // Don't re-prompt the user. showOneTapUI = false } CommonStatusCodes.NETWORK_ERROR -> { Log.d(TAG, "One-tap encountered a network error.") // Try again or just ignore. } else -> { Log.d(TAG, "Couldn't get credential from result." + " (${e.localizedMessage})") } } } } } } // ... }
Langkah berikutnya
Saat pengguna menyelesaikan alur pendaftaran Sekali Ketuk, Anda akan mendapatkan token ID Google, yang mencakup beberapa informasi profil dasar: alamat email, nama lengkap, dan URL foto profil pengguna. Untuk banyak aplikasi, informasi ini sudah cukup bagi Anda untuk mengautentikasi pengguna di backend dan membuat akun baru.
Jika Anda memerlukan informasi tambahan untuk menyelesaikan pembuatan akun—misalnya, tanggal lahir pengguna—tampilkan alur detail pendaftaran kepada pengguna, tempat Anda meminta info tambahan ini. Kemudian, kirimkan ke backend Anda untuk menyelesaikan pembuatan akun.