Login Akun Tertaut memungkinkan Login Sekali Ketuk dengan Google bagi pengguna yang telah menautkan Akun Google mereka ke layanan Anda. Hal ini meningkatkan pengalaman pengguna karena mereka dapat login dengan sekali klik, tanpa memasukkan kembali nama pengguna dan sandi mereka. 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 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-nya dengan akunnya di layanan Anda, token ID akan ditampilkan untuk akun yang ditautkan.
- Pengguna akan melihat dialog login Sekali Ketuk dengan opsi untuk login ke layanan Anda dengan akun tertautnya.
- 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 di langkah 2 untuk mengidentifikasi pengguna yang login.
Penyiapan
Untuk menyiapkan Login Akun Tertaut, konfigurasikan lingkungan pengembangan dan aplikasi Anda.
Menyiapkan lingkungan pengembangan
Dapatkan layanan Google Play terbaru di host pengembangan Anda:
- Buka Android SDK Manager.
Di bagian SDK Tools, temukan layanan Google Play.
Jika status untuk paket ini bukan Installed, 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 API "Link with Google" ke file gradle level aplikasi modul Anda, biasanya
app/build.gradle:dependencies { implementation 'com.google.android.gms:play-services-auth:21.3.0' }
Mengubah aplikasi Android Anda untuk mendukung Login dengan 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") } });Membuat 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 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().