Login menggunakan token ID

Setelah berhasil mengambil kredensial pengguna atau mengambil petunjuk login, Anda dapat memeriksa apakah token ID tersedia untuk kredensial tersebut. Token ID adalah pernyataan identitas pengguna yang ditandatangani dan juga berisi informasi profil dasar pengguna, kemungkinan termasuk alamat email yang telah diverifikasi oleh Google. Jika token ID tersedia, Anda dapat menggunakannya untuk melakukan autentikasi dengan aman ke backend aplikasi, atau untuk melewati langkah verifikasi email saat membuat akun baru.

Token ID tersedia jika ID pengguna objek Credential cocok dengan ID pengguna akun Google yang login di perangkat.

Untuk login dengan token ID, ambil token ID terlebih dahulu dengan metode getIdTokens. Kemudian, kirim token ID ke backend aplikasi Anda. Di backend, verifikasi token menggunakan library klien Google API atau library JWT tujuan umum.

Sebelum memulai

Mendapatkan token ID dari objek Kredensial

Setelah Anda mengambil kredensial pengguna, periksa apakah objek Credentials mencakup token ID. Jika ya, panggil getIdTokens untuk mengambilnya, dan kirimkan ke backend Anda melalui HTTPS POST.

if (!credential.getIdTokens().isEmpty()) {
    String idToken = credential.getIdTokens().get(0).getIdToken();

    HttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost("https://yourbackend.example.com/tokensignin");

    try {
        List nameValuePairs = new ArrayList(1);
        nameValuePairs.add(new BasicNameValuePair("idToken", idToken));
        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        HttpResponse response = httpClient.execute(httpPost);
        int statusCode = response.getStatusLine().getStatusCode();
        final String responseBody = EntityUtils.toString(response.getEntity());
        Log.i(TAG, "Signed in as: " + responseBody);
    }
}

Memverifikasi token ID di backend

Setelah menerima token ID melalui HTTPS POST, Anda harus memverifikasi tanda tangan token, dan memverifikasi klaim aud, iss, dan exp token.

Klaim aud token ID dari Smart Lock untuk Sandi memiliki format berikut:

android://SHA512_HASH@ANDROID_PACKAGE_NAME

Nilai SHA512HASH adalah hash SHA-512 dari sertifikat penandatanganan Anda. Anda bisa mendapatkan nilai ini menggunakan utilitas keytool dan openssl:

keytool -exportcert -keystore path-to-keystore -alias key-name 
| openssl sha -sha512 -binary
| base64 -w 0
| tr '+/' '-
'

Atau, Anda bisa mendapatkan hash SHA-512 dengan memeriksa token ID yang Anda ketahui valid.

Library JWT dapat menangani beberapa tugas verifikasi ini untuk Anda. Misalnya, menggunakan Google Auth Library untuk 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;

...

// Verifier that checks that the token has the proper issuer and audience,
// and hasn't expired
private static GoogleIdTokenVerifier verifier =
    new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
        .setAudience(Arrays.asList(String.format("android://%s@%s", SHA512_HASH, PACKAGE_NAME)))
        .build();

// (Receive idTokenString by HTTPS POST)

GoogleIdToken idToken = verifier.verify(idTokenString);
if (idToken != null) {
  Payload payload = idToken.getPayload();
  System.out.println("User email: " + payload.getEmail());
  if (payload.getEmailVerified()) {
    System.out.println("Email verified by Google.");
  }
} else {
  System.out.println("Invalid ID token.");
}

Lihat dokumentasi Login dengan Google untuk mengetahui detail selengkapnya.