Bermigrasi dari GoogleAuthUtil dan Plus.API

Jika sebelumnya Anda terintegrasi dengan Login dengan Google menggunakan GoogleAuthUtil.getToken atau Plus.API, Anda harus bermigrasi ke aplikasi Sign-In API untuk keamanan yang lebih baik dan pengalaman pengguna yang lebih baik.

Bermigrasi dari anti-pola token akses

Anda tidak boleh mengirim token akses yang diperoleh dengan GoogleAuthUtil.getToken ke server backend Anda sebagai pernyataan identitas, karena Anda tidak bisa memverifikasi token telah dikirimkan ke backend, sehingga membuat Anda rentan terhadap penyisipan token akses dari penyerang.

Misalnya, jika kode Android terlihat seperti contoh di bawah ini, Anda harus memigrasikan aplikasi Anda ke praktik terbaik saat ini.

Kode Android

Dalam contoh, permintaan token akses menggunakan oauth2: ditambah string cakupan sebagai Parameter scope untuk panggilan GoogleAuthUtil.getToken (oauth2:https://www.googleapis.com/auth/plus.login).

Alih-alih melakukan otentikasi dengan token akses yang diperoleh dengan GoogleAuthUtil.getToken, gunakan alur token ID atau alur kode autentikasi.

Bermigrasi ke alur token ID

Jika yang Anda butuhkan hanyalah ID, alamat email, nama, atau URL foto profil pengguna, gunakan alur token ID.

Untuk bermigrasi ke alur token ID, buat perubahan berikut:

Sisi klien Android

  • Hapus izin GET_ACCOUNTS (Kontak) jika Anda memintanya
  • Mengganti kode apa pun menggunakan GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent(), atau AccountManager.newChooseAccountIntent() ke Auth.GOOGLE_SIGN_IN_API dengan konfigurasi GoogleSignInOptions.Builder.requestIdToken(...).

Sisi server

  • Buat endpoint baru untuk Autentikasi token ID
  • Nonaktifkan endpoint lama setelah aplikasi klien dimigrasikan

Bermigrasi ke alur kode autentikasi server

Jika server Anda perlu mengakses Google API lainnya, seperti Google Drive, YouTube, atau Kontak, gunakan alur kode autentikasi server.

Untuk bermigrasi ke alur kode autentikasi server, buat perubahan berikut:

Sisi klien Android

  • Hapus izin GET_ACCOUNTS (Kontak) jika Anda memintanya
  • Mengganti kode apa pun menggunakan GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent(), atau AccountManager.newChooseAccountIntent() ke Auth.GOOGLE_SIGN_IN_API dengan konfigurasi GoogleSignInOptions.Builder.requestServerAuthCode(...).

Sisi server

Anda masih dapat membagikan logika akses API antara endpoint lama dan baru. Contoh:

GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(...);
String accessToken = tokenResponse.getAccessToken();
String refreshToken = tokenResponse.getRefreshToken();
Long expiresInSeconds = tokenResponse.getExpiresInSeconds();

// Shared by your old and new implementation, old endpoint can pass null for refreshToken
private void driveAccess(String refreshToken, String accessToken, Long expiresInSeconds) {
   GoogleCredential credential = new GoogleCredential.Builder()
           .setTransPort(...)
           ...
           .build();
   credential.setAccessToken(accessToken);
   credential.setExpiresInSeconds(expiresInSeconds);
   credential.setRefreshToken(refreshToken);
}

Bermigrasi dari alur token ID GoogleAuthUtil

Jika Anda menggunakan GoogleAuthUtil untuk mendapatkan token ID, Anda harus bermigrasi ke token ID baru Alur token ID Login API.

Misalnya, jika kode Android terlihat seperti contoh berikut, Anda harus migrate:

Kode Android

Dalam contoh, permintaan token ID menggunakan audience:server:client_id dan ID klien untuk server web Anda sebagai parameter ‘scope’ untuk GoogleAuthUtil.getToken panggilan (audience:server:client_id:9414861317621.apps.googleusercontent.com).

Alur token ID Sign-In API yang baru memiliki manfaat berikut:

  • Pengalaman login sekali ketuk yang disederhanakan
  • Server Anda bisa mendapatkan informasi profil pengguna tanpa panggilan jaringan tambahan

Untuk bermigrasi ke alur token ID, buat perubahan berikut:

Sisi klien Android

  • Hapus izin GET_ACCOUNTS (Kontak) jika Anda memintanya
  • Mengganti kode apa pun menggunakan GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent(), atau AccountManager.newChooseAccountIntent() ke Auth.GOOGLE_SIGN_IN_API dengan konfigurasi GoogleSignInOptions.Builder.requestIdToken(...).

Sisi server

Sign-In API yang baru mengeluarkan token ID yang sesuai dengan OpenID Connect spesifikasi, tidak seperti GoogleAuthUtil.getToken, yang menggunakan format yang tidak digunakan lagi. Secara khusus, penerbitnya sekarang https://accounts.google.com, dengan https skema.

Selama proses migrasi, server Anda perlu memverifikasi token ID dari kedua platform tersebut klien Android lama dan baru Anda. Untuk memverifikasi kedua format token, buat yang sesuai dengan library klien yang Anda gunakan (jika Anda menggunakannya):

  • Java (Library Klien Google API): upgrade ke versi 1.21.0 atau yang lebih baru
  • PHP (Library Klien Google API): jika Anda menggunakan v1, upgrade ke 1.1.6 atau yang lebih baru; jika Anda menggunakan v2, upgrade ke 2.0.0-RC1 atau yang lebih baru
  • Node.js: upgrade ke versi 0.9.7 atau yang lebih baru
  • Python atau implementasi Anda sendiri: terima kedua penerbit ini: https://accounts.google.com dan accounts.google.com

Bermigrasi dari alur kode autentikasi server GoogleAuthUtil

Jika Anda menggunakan GoogleAuthUtil untuk mendapatkan kode autentikasi server, Anda harus bermigrasi ke alur kode autentikasi Sign-In API yang baru.

Misalnya, jika kode Android terlihat seperti contoh berikut, Anda harus migrate:

Kode Android

Dalam contoh, permintaan kode autentikasi server menggunakan oauth2:server:client_id + ID klien untuk server web Anda sebagai parameter scope untuk Panggilan GoogleAuthUtil.getToken (oauth2:server:client_id:9414861317621.apps.googleusercontent.com).

Alur kode autentikasi Sign-In API yang baru memiliki manfaat berikut:

  • Pengalaman login sekali ketuk yang disederhanakan
  • Jika Anda mengikuti panduan migrasi di bawah, server Anda bisa mendapatkan token ID yang berisi informasi profil pengguna saat Anda melakukan pertukaran kode auth

Untuk bermigrasi ke alur kode autentikasi baru, buat perubahan berikut:

Sisi klien Android

  • Hapus izin GET_ACCOUNTS (Kontak) jika Anda memintanya
  • Mengganti kode apa pun menggunakan GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent(), atau AccountManager.newChooseAccountIntent() ke Auth.GOOGLE_SIGN_IN_API dengan konfigurasi GoogleSignInOptions.Builder.requestServerAuthCode(...).

Sisi server

Simpan kode Anda saat ini, tetapi tentukan https://oauth2.googleapis.com/token sebagai endpoint server token saat membangun GoogleAuthorizationCodeTokenRequest, agar Anda bisa mendapatkan token ID dengan email, ID pengguna, dan info profil pengguna tanpa perlu yang lain panggilan jaringan. Endpoint ini sepenuhnya kompatibel dengan versi sebelumnya, dan kode di bawah ini akan berfungsi untuk kode autentikasi server yang diambil dari perangkat Android lama dan baru implementasi klien.

GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(
                transport,
                jsonFactory,
                // Use below for tokenServerEncodedUrl parameter
                "https://oauth2.googleapis.com/token",
                clientSecrets.getDetails().getClientId(),
                clientSecrets.getDetails().getClientSecret(),
                authCode,
                REDIRECT_URI)
               .execute();

...

// You can also get an ID token from auth code exchange.
GoogleIdToken googleIdToken = tokenResponse.parseIdToken();
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
        .setAudience(Arrays.asList(SERVER_CLIENT_ID))
        .setIssuer("https://accounts.google.com")
        .build();
// Refer to ID token documentation to see how to get data from idToken object.
GoogleIdToken idToken = verifier.verify(idTokenString);
...