Login Akun Tertaut untuk Android

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

  1. Anda memilih untuk menampilkan akun tertaut selama alur Login Sekali Ketuk.
  2. Jika pengguna login di Google dan telah menautkan Akun Google mereka dengan akun mereka 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 menggunakan 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 Google Play services.

  2. Jika status untuk paket ini bukan Terinstal, pilih keduanya, lalu klik Install Packages.

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 "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.

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