Login Akun Tertaut mengaktifkan Login Sekali Ketuk dengan Google bagi pengguna yang sudah menautkan Akun Google mereka ke layanan Anda. Tindakan ini akan meningkatkan pengalaman pengguna karena mereka dapat login dengan sekali klik, tanpa perlu memasukkan ulang nama pengguna dan sandi. Tindakan ini juga mengurangi kemungkinan pengguna membuat akun duplikat di layanan Anda.
Login Akun Tertaut tersedia sebagai bagian dari alur Login Sekali Ketuk untuk Android. Ini berarti Anda tidak perlu mengimpor library terpisah jika aplikasi Anda telah mengaktifkan fitur Sekali Ketuk.
Dalam dokumen ini, Anda akan mempelajari cara memodifikasi aplikasi Android untuk mendukung Login Akun Tertaut.
Cara kerjanya
- Anda memilih untuk menampilkan akun tertaut selama alur Login Sekali Ketuk.
- Jika pengguna login di Google dan telah menautkan Akun Google mereka dengan akunnya di layanan Anda, token ID akan ditampilkan untuk akun tertaut.
- Pengguna akan melihat perintah login Sekali Ketuk dengan opsi untuk login ke layanan Anda dengan akun tertaut mereka.
- Jika pengguna memilih untuk melanjutkan dengan akun tertaut, token ID pengguna akan ditampilkan ke aplikasi Anda. Anda mencocokkannya dengan token yang dikirim ke server pada langkah 2 untuk mengidentifikasi pengguna yang sudah login.
Penyiapan
Menyiapkan lingkungan pengembangan
Dapatkan layanan Google Play terbaru di host pengembangan Anda:
- Buka Android SDK Manager.
Di bagian SDK Tools, cari layanan Google Play.
Jika status untuk paket ini tidak Terinstal, pilih keduanya, lalu klik Install Packages.
Mengonfigurasi aplikasi Anda
Dalam file
build.gradle
level project, sertakan repositori Maven Google di bagianbuildscript
danallprojects
.buildscript { repositories { google() } } allprojects { repositories { google() } }
Tambahkan dependensi untuk API "Link with Google" ke file gradle level aplikasi modul, biasanya
app/build.gradle
:dependencies { implementation 'com.google.android.gms:play-services-auth:21.0.0' }
Mengubah aplikasi Android untuk mendukung Login Akun Tertaut
Di akhir alur Login Akun Tertaut, token ID akan ditampilkan ke aplikasi Anda. Integritas token ID harus diverifikasi sebelum pengguna login.
Contoh kode berikut menjelaskan langkah-langkah untuk mengambil, memverifikasi token ID, dan kemudian memproses login pengguna.
Membuat aktivitas untuk menerima hasil intent Login
Kotlin
private val activityResultLauncher = registerForActivityResult( ActivityResultContracts.StartIntentSenderForResult()) { result -> if (result.resultCode == RESULT_OK) { try { val signInCredentials = Identity.signInClient(this) .signInCredentialFromIntent(result.data) // Review the Verify the integrity of the ID token section for // details on how to verify the ID token verifyIdToken(signInCredential.googleIdToken) } catch (e: ApiException) { Log.e(TAG, "Sign-in failed with error code:", e) } } else { Log.e(TAG, "Sign-in failed") } }
Java
private final ActivityResultLauncher<IntentSenderResult> activityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartIntentSenderForResult(), result -> { If (result.getResultCode() == RESULT_OK) { try { SignInCredential signInCredential = Identity.getSignInClient(this) .getSignInCredentialFromIntent(result.getData()); verifyIdToken(signInCredential.getGoogleIdToken()); } catch (e: ApiException ) { Log.e(TAG, "Sign-in failed with error:", e) } } else { Log.e(TAG, "Sign-in failed") } });
Membangun permintaan login
Kotlin
private val tokenRequestOptions = GoogleIdTokenRequestOptions.Builder() .supported(true) // Your server's client ID, not your Android client ID. .serverClientId(getString("your-server-client-id") .filterByAuthorizedAccounts(true) .associateLinkedAccounts("service-id-of-and-defined-by-developer", scopes) .build()
Java
private final GoogleIdTokenRequestOptions tokenRequestOptions = GoogleIdTokenRequestOptions.Builder() .setSupported(true) .setServerClientId("your-service-client-id") .setFilterByAuthorizedAccounts(true) .associateLinkedAccounts("service-id-of-and-defined-by-developer", scopes) .build()
Meluncurkan intent Sign-In Pending
Kotlin
Identity.signInClient(this) .beginSignIn( BeginSignInRequest.Builder() .googleIdTokenRequestOptions(tokenRequestOptions) .build()) .addOnSuccessListener{result -> activityResultLauncher.launch(result.pendingIntent.intentSender) } .addOnFailureListener {e -> Log.e(TAG, "Sign-in failed because:", e) }
Java
Identity.getSignInClient(this) .beginSignIn( BeginSignInRequest.Builder() .setGoogleIdTokenRequestOptions(tokenRequestOptions) .build()) .addOnSuccessListener(result -> { activityResultLauncher.launch( result.getPendingIntent().getIntentSender()); }) .addOnFailureListener(e -> { Log.e(TAG, "Sign-in failed because:", e); });
Memverifikasi integritas token ID
Untuk memverifikasi bahwa token valid, pastikan kriteria berikut terpenuhi:
- Token ID ditandatangani dengan benar oleh Google. Gunakan kunci publik Google (tersedia dalam format JWK atau PEM) untuk memverifikasi tanda tangan token. Kunci ini dirotasi secara rutin; periksa header
Cache-Control
dalam respons untuk menentukan kapan Anda harus mengambilnya lagi. - Nilai
aud
dalam token ID sama dengan salah satu client ID aplikasi Anda. Pemeriksaan ini diperlukan untuk mencegah token ID yang dikeluarkan ke aplikasi berbahaya digunakan untuk mengakses data tentang pengguna yang sama di server backend aplikasi Anda. - Nilai
iss
dalam token ID sama denganaccounts.google.com
atauhttps://accounts.google.com
. - Waktu habis masa berlaku (
exp
) token ID belum berlalu. - Jika perlu memvalidasi bahwa token ID mewakili akun organisasi Google Workspace atau Cloud, Anda dapat memeriksa klaim
hd
, yang menunjukkan domain yang dihosting pengguna. Ini harus digunakan saat membatasi akses ke resource hanya untuk anggota domain tertentu. Tidak adanya klaim ini menunjukkan bahwa akun tersebut bukan milik domain yang dihosting Google.
Daripada menulis kode Anda sendiri untuk melakukan langkah-langkah verifikasi ini, sebaiknya gunakan library klien Google API untuk platform Anda, atau library JWT tujuan umum. Untuk pengembangan dan proses debug, Anda dapat memanggil endpoint validasi tokeninfo
kami.
Menggunakan Library Klien Google API
Penggunaan Library Klien Google API Java adalah cara yang direkomendasikan untuk memvalidasi token ID Google di lingkungan produksi.
Java
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
...
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
// Specify the CLIENT_ID of the app that accesses the backend:
.setAudience(Collections.singletonList(CLIENT_ID))
// Or, if multiple clients access the backend:
//.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3))
.build();
// (Receive idTokenString by HTTPS POST)
GoogleIdToken idToken = verifier.verify(idTokenString);
if (idToken != null) {
Payload payload = idToken.getPayload();
// Print user identifier
String userId = payload.getSubject();
System.out.println("User ID: " + userId);
// Get profile information from payload
String email = payload.getEmail();
boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());
String name = (String) payload.get("name");
String pictureUrl = (String) payload.get("picture");
String locale = (String) payload.get("locale");
String familyName = (String) payload.get("family_name");
String givenName = (String) payload.get("given_name");
// Use or store profile information
// ...
} else {
System.out.println("Invalid ID token.");
}
Metode GoogleIdTokenVerifier.verify()
memverifikasi tanda tangan JWT, klaim aud
, klaim iss
, dan klaim exp
.
Jika perlu memvalidasi bahwa token ID mewakili akun organisasi Google Workspace atau Cloud, Anda dapat memverifikasi klaim hd
dengan memeriksa nama domain yang ditampilkan oleh metode Payload.getHostedDomain()
.
Memanggil endpoint tokeninfo
Cara mudah untuk memvalidasi tanda tangan token ID untuk proses debug adalah dengan menggunakan endpoint tokeninfo
. Pemanggilan endpoint ini melibatkan permintaan jaringan tambahan yang melakukan sebagian besar validasi untuk Anda saat Anda menguji validasi dan ekstraksi payload yang tepat dalam kode Anda sendiri. Fitur ini tidak cocok untuk digunakan dalam kode produksi karena permintaan dapat diperlambat atau dapat mengalami error yang berselang-seling.
Untuk memvalidasi token ID menggunakan endpoint tokeninfo
, buat permintaan HTTPS
POST atau GET ke endpoint, dan teruskan token ID di
parameter id_token
.
Misalnya, untuk memvalidasi token "XYZ123", buat permintaan GET berikut:
https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123
Jika token ditandatangani dengan benar dan klaim iss
serta exp
memiliki nilai yang diharapkan, Anda akan mendapatkan respons HTTP 200, dengan isinya berisi klaim token ID berformat JSON.
Berikut adalah contoh respons:
{ // These six fields are included in all Google ID Tokens. "iss": "https://accounts.google.com", "sub": "110169484474386276334", "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com", "aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com", "iat": "1433978353", "exp": "1433981953", // These seven fields are only included when the user has granted the "profile" and // "email" OAuth scopes to the application. "email": "testuser@gmail.com", "email_verified": "true", "name" : "Test User", "picture": "https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP/tIXL9Ir44LE/s99-c/photo.jpg", "given_name": "Test", "family_name": "User", "locale": "en" }
Jika perlu memvalidasi bahwa token ID mewakili akun Google Workspace, Anda dapat memeriksa
klaim hd
, yang menunjukkan domain yang dihosting dari pengguna. Ini harus digunakan saat membatasi akses ke resource hanya untuk anggota domain tertentu. Tidak adanya klaim ini
menunjukkan bahwa akun tersebut bukan milik domain yang dihosting Google Workspace.