Login dengan Google membantu Anda mengintegrasikan autentikasi pengguna dengan cepat ke aplikasi Android Anda. Pengguna dapat menggunakan Akun Google mereka untuk login ke aplikasi Anda, memberikan izin, dan membagikan informasi profil mereka secara aman ke aplikasi Anda. Library Jetpack Credential Manager Android membuat integrasi ini lancar, dengan menawarkan pengalaman yang konsisten di seluruh perangkat Android menggunakan satu API.
Dokumen ini memandu Anda menerapkan Login dengan Google di aplikasi Android, cara menyiapkan UI tombol Login dengan Google, dan mengonfigurasi pengalaman pendaftaran dan login sekali ketuk yang dioptimalkan untuk aplikasi. Untuk migrasi perangkat yang lancar, Login dengan Google mendukung login otomatis, dan sifat lintas platformnya di seluruh platform Android, iOS, dan web membantu Anda memberikan akses login untuk aplikasi Anda di perangkat mana pun. Jika Anda menggunakan Firebase Authentication untuk aplikasi, Anda dapat mempelajari lebih lanjut cara mengintegrasikan Login dengan Google dan Credential Manager dalam panduan Mengautentikasi dengan Google di Android.
Untuk menyiapkan Login dengan Google, ikuti dua langkah utama berikut:
Konfigurasi Login dengan Google sebagai opsi untuk UI sheet bawah Credential Manager. Hal ini dapat dikonfigurasi untuk meminta pengguna login secara otomatis. Jika telah menerapkan kunci sandi atau sandi, Anda dapat meminta semua jenis kredensial yang relevan secara bersamaan, sehingga pengguna tidak perlu mengingat opsi yang telah digunakan sebelumnya untuk login.

Tambahkan tombol Login dengan Google ke UI aplikasi Anda. Tombol Login dengan Google menawarkan cara yang mudah bagi pengguna untuk menggunakan Akun Google yang sudah ada untuk mendaftar atau login ke aplikasi Android. Pengguna akan mengklik tombol Login dengan Google jika mereka menutup UI panel bawah, atau jika mereka secara eksplisit ingin menggunakan Akun Google mereka untuk mendaftar dan login. Bagi developer, hal ini berarti orientasi pengguna yang lebih mudah dan berkurangnya hambatan selama pendaftaran.

Dokumen ini menjelaskan cara mengintegrasikan tombol dan dialog sheet bawah Login dengan Google ke Credential Manager API menggunakan library helper ID Google.
Menyiapkan project
- Buka project Anda di , atau buat project jika Anda belum memilikinya.
- Di ,
pastikan semua informasi sudah lengkap dan akurat.
- Pastikan aplikasi Anda memiliki Nama Aplikasi, Logo Aplikasi, dan Halaman Beranda Aplikasi yang ditetapkan dengan benar. Nilai ini akan ditampilkan kepada pengguna di layar izin Login dengan Google saat mendaftar dan di layar Aplikasi & layanan pihak ketiga.
- Pastikan Anda telah menentukan URL kebijakan privasi dan persyaratan layanan aplikasi Anda.
- Di , buat ID klien Android untuk aplikasi Anda jika Anda belum memilikinya. Anda harus menentukan nama paket dan tanda tangan SHA-1 aplikasi Anda.
- Di , buat ID klien "Aplikasi web" baru jika Anda belum melakukannya. Anda dapat mengabaikan kolom "Authorized JavaScript Origins" dan "Authorized redirect URIs" untuk saat ini. ID klien ini akan digunakan untuk mengidentifikasi server backend Anda saat berkomunikasi dengan layanan autentikasi Google.
Mendeklarasikan dependensi
Dalam file build.gradle modul Anda, deklarasikan dependensi menggunakan versi terbaru Credential Manager:
dependencies {
// ... other dependencies
implementation "androidx.credentials:credentials:<latest version>"
implementation "androidx.credentials:credentials-play-services-auth:<latest version>"
implementation "com.google.android.libraries.identity.googleid:googleid:<latest version>"
}
Membuat instance permintaan login dengan Google
Untuk memulai implementasi, buat instance permintaan login dengan Google. Gunakan
GetGoogleIdOption
untuk mengambil Token ID Google pengguna.
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(true)
.setServerClientId(WEB_CLIENT_ID)
.setAutoSelectEnabled(true)
// nonce string to use when generating a Google ID token
.setNonce(nonce)
.build()
Pertama, periksa apakah pengguna memiliki akun yang sebelumnya digunakan untuk login
ke aplikasi Anda dengan memanggil API dengan parameter setFilterByAuthorizedAccounts
yang ditetapkan ke true
. Pengguna dapat memilih akun yang tersedia untuk login.
Jika tidak ada Akun Google resmi yang tersedia, pengguna akan diminta untuk mendaftar dengan akun yang tersedia. Untuk melakukannya, minta pengguna dengan
memanggil API lagi dan menyetel setFilterByAuthorizedAccounts
ke false
.
Pelajari lebih lanjut pendaftaran.
Mengaktifkan login otomatis untuk pengguna yang kembali (direkomendasikan)
Developer harus mengaktifkan login otomatis untuk pengguna yang mendaftar dengan satu akun mereka. Hal ini memberikan pengalaman yang lancar di seluruh perangkat, terutama selama migrasi perangkat, di mana pengguna dapat dengan cepat mendapatkan kembali akses ke akun mereka tanpa memasukkan kembali kredensial. Bagi pengguna Anda, tindakan ini akan menghilangkan hambatan yang tidak perlu saat mereka sudah login sebelumnya.
Untuk mengaktifkan login otomatis, gunakan setAutoSelectEnabled(true)
. Login otomatis
hanya memungkinkan jika kriteria berikut terpenuhi:
- Ada satu kredensial yang cocok dengan permintaan, yang dapat berupa Akun Google atau sandi, dan kredensial ini cocok dengan akun default di perangkat berteknologi Android.
- Pengguna belum logout secara eksplisit.
- Pengguna belum menonaktifkan login otomatis di setelan Akun Google mereka.
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(true)
.setServerClientId(WEB_CLIENT_ID)
.setAutoSelectEnabled(true)
// nonce string to use when generating a Google ID token
.setNonce(nonce)
.build()
Ingatlah untuk menangani logout dengan benar saat menerapkan login otomatis, sehingga pengguna selalu dapat memilih akun yang tepat setelah mereka logout dari aplikasi Anda secara eksplisit.
Menetapkan nonce untuk meningkatkan keamanan
Untuk meningkatkan keamanan login dan menghindari serangan replay, tambahkan
setNonce
untuk menyertakan nonce dalam setiap permintaan. Pelajari lebih lanjut
cara membuat nonce.
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(true)
.setServerClientId(WEB_CLIENT_ID)
.setAutoSelectEnabled(true)
// nonce string to use when generating a Google ID token
.setNonce(nonce)
.build()
Membuat alur Login dengan Google
Langkah-langkah untuk menyiapkan alur Login dengan Google adalah sebagai berikut:
- Buat instance
GetCredentialRequest
, lalu tambahkangoogleIdOption
yang dibuat sebelumnya menggunakanaddCredentialOption()
untuk mengambil kredensial. - Teruskan permintaan ini ke panggilan
getCredential()
(Kotlin) ataugetCredentialAsync()
(Java) untuk mengambil kredensial pengguna yang tersedia. - Setelah API berhasil, ekstrak
CustomCredential
yang menyimpan hasil untuk dataGoogleIdTokenCredential
. - Jenis untuk
CustomCredential
harus sama dengan nilaiGoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL
. Konversi objek menjadiGoogleIdTokenCredential
menggunakan metodeGoogleIdTokenCredential.createFrom
. Jika konversi berhasil, ekstrak ID
GoogleIdTokenCredential
, validasi, lalu autentikasi kredensial di server Anda.Jika konversi gagal dengan
GoogleIdTokenParsingException
, Anda mungkin perlu mengupdate versi library Login dengan Google.Tangkap jenis kredensial kustom yang tidak dikenal.
val request: GetCredentialRequest = GetCredentialRequest.Builder()
.addCredentialOption(googleIdOption)
.build()
coroutineScope {
try {
val result = credentialManager.getCredential(
request = request,
context = activityContext,
)
handleSignIn(result)
} catch (e: GetCredentialException) {
// Handle failure
}
}
fun handleSignIn(result: GetCredentialResponse) {
// Handle the successfully returned credential.
val credential = result.credential
val responseJson: String
when (credential) {
// Passkey credential
is PublicKeyCredential -> {
// Share responseJson such as a GetCredentialResponse to your server to validate and
// authenticate
responseJson = credential.authenticationResponseJson
}
// Password credential
is PasswordCredential -> {
// Send ID and password to your server to validate and authenticate.
val username = credential.id
val password = credential.password
}
// GoogleIdToken credential
is CustomCredential -> {
if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
try {
// Use googleIdTokenCredential and extract the ID to validate and
// authenticate on your server.
val googleIdTokenCredential = GoogleIdTokenCredential
.createFrom(credential.data)
// You can use the members of googleIdTokenCredential directly for UX
// purposes, but don't use them to store or control access to user
// data. For that you first need to validate the token:
// pass googleIdTokenCredential.getIdToken() to the backend server.
// see [validation instructions](https://developers.google.com/identity/gsi/web/guides/verify-google-id-token)
} catch (e: GoogleIdTokenParsingException) {
Log.e(TAG, "Received an invalid google id token response", e)
}
} else {
// Catch any unrecognized custom credential type here.
Log.e(TAG, "Unexpected type of credential")
}
}
else -> {
// Catch any unrecognized credential type here.
Log.e(TAG, "Unexpected type of credential")
}
}
}
Memicu alur tombol Login dengan Google
Untuk memicu alur tombol Login dengan Google, gunakan
GetSignInWithGoogleOption
, bukan
GetGoogleIdOption
:
val signInWithGoogleOption: GetSignInWithGoogleOption = GetSignInWithGoogleOption.Builder(
serverClientId = WEB_CLIENT_ID
).setNonce(nonce)
.build()
Tangani GoogleIdTokenCredential
yang ditampilkan seperti yang dijelaskan dalam
contoh kode berikut.
fun handleSignInWithGoogleOption(result: GetCredentialResponse) {
// Handle the successfully returned credential.
val credential = result.credential
when (credential) {
is CustomCredential -> {
if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
try {
// Use googleIdTokenCredential and extract id to validate and
// authenticate on your server.
val googleIdTokenCredential = GoogleIdTokenCredential
.createFrom(credential.data)
} catch (e: GoogleIdTokenParsingException) {
Log.e(TAG, "Received an invalid google id token response", e)
}
}
else {
// Catch any unrecognized credential type here.
Log.e(TAG, "Unexpected type of credential")
}
}
else -> {
// Catch any unrecognized credential type here.
Log.e(TAG, "Unexpected type of credential")
}
}
}
Setelah Anda membuat instance permintaan login dengan Google, luncurkan alur autentikasi dengan cara yang sama seperti yang disebutkan di bagian Login dengan Google.
Aktifkan pendaftaran untuk pengguna baru (direkomendasikan)
Login dengan Google adalah cara termudah bagi pengguna untuk membuat akun baru dengan aplikasi atau layanan Anda hanya dalam beberapa ketukan.
Jika tidak ada kredensial tersimpan yang ditemukan (tidak ada Akun Google yang ditampilkan oleh
getGoogleIdOption
), minta pengguna Anda untuk mendaftar. Pertama, periksa apakah
setFilterByAuthorizedAccounts(true)
untuk melihat apakah ada akun yang sebelumnya digunakan. Jika tidak ada yang ditemukan, minta pengguna untuk mendaftar dengan Akun Google mereka menggunakan setFilterByAuthorizedAccounts(false)
Contoh:
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(false)
.setServerClientId(WEB_CLIENT_ID)
.build()
Setelah Anda membuat instance permintaan pendaftaran Google, luncurkan alur autentikasi. Jika pengguna tidak ingin menggunakan Login dengan Google untuk mendaftar, pertimbangkan untuk mengoptimalkan aplikasi Anda untuk pengisian otomatis. Setelah pengguna Anda membuat akun, pertimbangkan untuk mendaftarkan mereka ke kunci sandi sebagai langkah terakhir dalam pembuatan akun.
Menangani logout
Saat pengguna logout dari aplikasi Anda, panggil metode clearCredentialState()
API
untuk menghapus status kredensial pengguna saat ini dari semua penyedia kredensial.
Tindakan ini akan memberi tahu semua penyedia kredensial bahwa sesi kredensial tersimpan untuk aplikasi tertentu harus dihapus.
Penyedia kredensial mungkin telah menyimpan sesi kredensial aktif dan menggunakannya untuk membatasi opsi login untuk panggilan get-credential mendatang. Misalnya, kredensial aktif dapat diprioritaskan daripada kredensial lain yang tersedia. Saat pengguna Anda logout secara eksplisit dari aplikasi Anda dan untuk mendapatkan opsi login yang holistik pada waktu berikutnya, Anda harus memanggil API ini agar penyedia menghapus sesi kredensial yang tersimpan.