Login Akun Tertaut memungkinkan Login Sekali Ketuk dengan Google untuk pengguna yang sudah menautkan Akun Google mereka ke layanan Anda. Hal ini meningkatkan pengalaman pengguna karena mereka dapat login dengan satu klik, tanpa memasukkan kembali 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. Artinya, Anda tidak perlu mengimpor library terpisah jika aplikasi Anda sudah mengaktifkan fitur Login Sekali Ketuk.
Dalam dokumen ini, Anda akan mempelajari cara mengubah 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 akun mereka di layanan Anda, token ID akan ditampilkan untuk akun tertaut.
- Pengguna akan melihat perintah login Sekali Ketuk dengan opsi untuk login ke layanan Anda menggunakan akun tertaut mereka.
- Jika pengguna memilih untuk melanjutkan dengan akun tertaut, token ID pengguna akan ditampilkan ke aplikasi Anda. Anda mencocokkan token ini dengan token yang dikirim ke server Anda pada langkah 2 untuk mengidentifikasi pengguna yang login.
Penyiapan
Menyiapkan lingkungan pengembangan
Dapatkan layanan Google Play terbaru di host pengembangan Anda:
- Buka Android SDK Manager.
Di bagian SDK Tools, temukan Google Play services.
Jika status untuk paket ini bukan Terinstal, pilih keduanya, lalu klik Install Packages.
Mengonfigurasi aplikasi Anda
Dalam file
build.gradlelevel project, sertakan repositori Maven Google di bagianbuildscriptdanallprojects.buildscript { repositories { google() } } allprojects { repositories { google() } }Tambahkan dependensi untuk "Link with Google" API ke file gradle level aplikasi modul Anda, yang biasanya adalah
app/build.gradle:dependencies { implementation 'com.google.android.gms:play-services-auth:21.3.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 selanjutnya membuat pengguna login.
Buat 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") } });Buat 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()Luncurkan intent Tertunda Login
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
Menggunakan Library Klien Google API
Menggunakan 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 Anda 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().