Login Akun Tertaut untuk Android

Login dengan Akun Tertaut memungkinkan Login Sekali Ketuk dengan Google bagi pengguna yang sudah menautkan Akun Google mereka ke layanan Anda. Hal ini meningkatkan pengalaman bagi pengguna karena mereka dapat login dengan sekali klik, tanpa memasukkan ulang nama pengguna dan sandi mereka. Hal 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 Ketuk Sekali.

Dalam dokumen ini, Anda akan mempelajari cara mengubah aplikasi Android untuk mendukung Login Akun Tertaut.

Cara kerjanya

  1. Anda memilih untuk menampilkan akun tertaut selama alur Login Sekali Ketuk.
  2. Jika pengguna login di Google dan telah menautkan Akun Google-nya dengan akunnya di layanan Anda, token ID akan ditampilkan untuk akun tertaut.
  3. Pengguna akan melihat perintah login Sekali Ketuk dengan opsi untuk login ke layanan Anda dengan akun tertaut mereka.
  4. 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:

  1. Buka Android SDK Manager.
  1. Di bagian SDK Tools, temukan layanan Google Play.

  2. Jika status untuk paket ini bukan Diinstal, pilih keduanya, lalu klik Instal Paket.

Mengonfigurasi aplikasi Anda

  1. Dalam file build.gradle level project, sertakan repositori Maven Google di bagian buildscript dan allprojects.

    buildscript {
        repositories {
            google()
        }
    }
    
    allprojects {
        repositories {
            google()
        }
    }
    
  2. 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 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 membuat pengguna login.

Contoh kode berikut menjelaskan langkah-langkah untuk mengambil, memverifikasi token ID, dan kemudian membuat pengguna login.

  1. 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")
        }
    });
    
  2. 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()
    
  3. Meluncurkan intent yang 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 klaimexp.

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().