Setelah Anda berhasil mengambil kredensial pengguna atau petunjuk login yang diambil, Anda dapat memeriksa apakah token ID tersedia untuk kredensial tersebut. Token ID adalah pernyataan bertanda tangan tentang identitas pengguna yang juga berisi profil dasar pengguna informasi tambahan, mungkin termasuk alamat email yang telah diverifikasi oleh Google. Saat token ID tersedia, Anda dapat menggunakannya untuk melakukan autentikasi dengan backend aplikasi, atau melewati langkah verifikasi email saat membuat akun baru.
Token ID tersedia jika ID pengguna objek Credential
cocok dengan pengguna
ID Akun Google yang login di perangkat.
Untuk login dengan token ID, pertama-tama ambil token ID dengan getIdTokens
. Kemudian, kirim token ID ke backend aplikasi Anda. Di backend, verifikasi
token menggunakan library klien Google API atau JWT tujuan umum
library.
Sebelum memulai
- Aplikasi Anda harus dapat mengambil kredensial pengguna atau ambil petunjuk login.
- Anda harus memanggil
setAccountTypes(IdentityProviders.GOOGLE)
saat membangun ObjekCredentialRequest
danHintRequest
.
Mendapatkan token ID dari objek Credentials
Setelah Anda mengambil kredensial pengguna, periksa apakah objek Credentials
menyertakan token ID. Jika ya, panggil getIdTokens
untuk mengambilnya, lalu kirimkan
ke backend Anda dengan 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, dan verifikasi klaim aud
, iss
, dan exp
token.
Klaim aud
token ID dari Smart Lock untuk Sandi memiliki hal berikut
format:
android://SHA512_HASH@ANDROID_PACKAGE_NAME
Nilai SHA512HASH adalah hash SHA-512 penandatanganan Anda
CA {i>root<i}. 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 library klien Google API 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.