Jika game Anda menggunakan server backend, sebaiknya gunakan Login dengan Google untuk mengautentikasi pemain dan meneruskan identitas pemain ke server backend dengan aman. Hal ini juga memungkinkan game Anda mengambil identitas pemain dan data lainnya dengan aman tanpa mengalami potensi gangguan saat melewati perangkat.
Dalam skenario ini, game Anda meminta pemain untuk login ke Layanan game Google Play seperti biasa. Saat pemain berhasil login, objek GoogleSignInAccount
berisi kode sekali pakai khusus (disebut kode autentikasi server) yang diteruskan klien ke server. Kemudian, di server, tukarkan
kode autentikasi server dengan token OAuth 2.0 yang dapat digunakan server untuk melakukan panggilan ke
Google Play Games Services API.
Untuk mendapatkan panduan tambahan tentang cara menambahkan login dalam game, lihat Login di Game Android.
Untuk melihat contoh kode mendetail yang menunjukkan cara menggunakan Login dengan Google untuk mengautentikasi pemain, lihat
contoh clientserverskeleton
di GitHub.
Langkah-langkah berikut diperlukan untuk akses offline:
- Di Konsol Google Play: Buat kredensial untuk server game Anda. Jenis klien OAuth kredensial adalah "web".
- Di aplikasi Android: Sebagai bagian dari login, minta kode autentikasi server untuk kredensial server Anda, dan teruskan ke server Anda.
- Di server game Anda: Tukarkan kode autentikasi server dengan token akses OAuth menggunakan layanan autentikasi Google, lalu gunakan ini untuk memanggil REST API Layanan game Play.
Sebelum memulai
Sebelum dapat mengintegrasikan Login dengan Google ke dalam game, Anda harus menambahkan game terlebih dahulu di Konsol Google Play, seperti yang dijelaskan dalam Menyiapkan Layanan game Google Play.
Membuat aplikasi web sisi server terkait untuk game Anda
Layanan game Google Play tidak menyediakan dukungan back-end untuk game Web. Namun, layanan ini menyediakan dukungan server back-end untuk server game Android Anda.
Jika Anda ingin menggunakan REST API untuk Layanan game Google Play di aplikasi sisi server, ikuti langkah-langkah berikut:
- Buat aplikasi web terkait untuk game Anda di bagian Aplikasi Tertaut di
Konsol Google Play. Perhatikan bahwa
launch_url
tidak digunakan untuk alur ini dan dapat dikosongkan. - Untuk mendapatkan informasi kredensial aplikasi Anda, ikuti langkah-langkah berikut:
- Dari game Anda di Konsol Google Play, klik Detail Game.
- Scroll ke bawah ke bagian Project Konsol API, lalu klik link ke project konsol API.
- Dari layar APIs & Services > Credentials di Konsol API
Google, download file
client_secret.json
untuk aplikasi web Anda dan simpan ke lokasi yang dapat diakses server Anda. Catat ID klien kredensial untuk referensi nanti.
- Mulai ulang aplikasi sisi server agar siap menerima permintaan dari aplikasi klien game Anda.
Melakukan login di klien
Class GoogleSignInClient
adalah titik entri utama untuk mengambil akun pemain yang saat ini
login, dan membuat pemain login jika mereka belum pernah melakukannya di aplikasi Anda
di perangkat.
Untuk membuat klien login, ikuti langkah-langkah berikut:
- Buat klien login melalui objek
GoogleSignInOptions
. DiGoogleSignInOptions.Builder
untuk mengonfigurasi login, Anda harus menentukanGoogleSignInOptions.DEFAULT_GAMES_SIGN_IN
. - Anda juga harus menentukan bahwa game Anda memerlukan kode
autentikasi untuk server backend dengan memanggil
metode
GoogleSignInOptions.Builder.requestServerAuthCode()
dengan client ID server sebagai parameter. Anda akan mengambil kode autentikasi nanti untuk token akses di server backend, seperti yang dijelaskan dalam Mendapatkan kode autentikasi server. - Panggil metode
GoogleSignIn.getClient()
dan teruskan opsi yang sebelumnya Anda konfigurasi. Jika panggilan berhasil, Google Sign-In API akan menampilkan instanceGoogleSignInClient
. - Setelah mendapatkan instance
GoogleSignInClient
, Anda harus melanjutkan untuk memproses login pemain secara otomatis darionResume()
aktivitas, seperti yang dijelaskan dalam Melakukan login otomatis.
Berikut contohnya:
private static final int RC_SIGN_IN = 9001; private GoogleSignInClient mGoogleSignInClient; private void startSignInForAuthCode() { // Client ID for your backend server. String webClientId = getString(R.string.webclient_id); GoogleSignInOptions signInOption = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN) .requestServerAuthCode(webClientId) .build(); GoogleSignInClient signInClient = GoogleSignIn.getClient(this, signInOption); Intent intent = signInClient.getSignInIntent(); startActivityForResult(intent, RC_SIGN_IN); }
Mendapatkan kode autentikasi server
Untuk mengambil kode autentikasi server yang dapat digunakan game Anda untuk token akses di server backend,
panggil metode getServerAuthCode()
pada objek GoogleSignInAccount
yang ditampilkan Login dengan Google saat pemain berhasil login.
Berikut contohnya:
// Auth code to send to backend server. private String mServerAuthCode; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); if (result.isSuccess()) { mServerAuthCode = result.getSignInAccount().getServerAuthCode(); } else { String message = result.getStatus().getStatusMessage(); if (message == null || message.isEmpty()) { message = getString(R.string.signin_other_error); } new AlertDialog.Builder(this).setMessage(message) .setNeutralButton(android.R.string.ok, null).show(); } } }
Menukar kode autentikasi server dengan token akses di server
Kirim kode autentikasi server ke server backend Anda untuk ditukar dengan token akses dan token refresh. Gunakan token akses untuk memanggil Google Play Games Services API atas nama pemain dan, secara opsional, simpan token refresh untuk memperoleh token akses baru saat masa berlaku token akses berakhir.
Cuplikan kode berikut menunjukkan cara menerapkan kode sisi server dalam bahasa pemrograman Java untuk menukar kode autentikasi server dengan token akses. Kode ini menggunakan aplikasi contoh clientserverskeleton:
/**
* Exchanges the authcode for an access token credential. The credential
* is the associated with the given player.
*
* @param authCode - the non-null authcode passed from the client.
* @param player - the player object which the given authcode is
* associated with.
* @return the HTTP response code indicating the outcome of the exchange.
*/
private int exchangeAuthCode(String authCode, Player player) {
try {
// The client_secret.json file is downloaded from the Google API
// console. This is used to identify your web application. The
// contents of this file should not be shared.
//
File secretFile = new File("client_secret.json");
// If we don't have the file, we can't access any APIs, so return
// an error.
if (!secretFile.exists()) {
log("Secret file : " + secretFile
.getAbsolutePath() + " does not exist!");
return HttpServletResponse.SC_FORBIDDEN;
}
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(
JacksonFactory.getDefaultInstance(), new
FileReader(secretFile));
// Extract the application id of the game from the client id.
String applicationId = extractApplicationId(clientSecrets
.getDetails().getClientId());
GoogleTokenResponse tokenResponse =
new GoogleAuthorizationCodeTokenRequest(
HTTPTransport,
JacksonFactory.getDefaultInstance(),
"https://oauth2.googleapis.com/token",
clientSecrets.getDetails().getClientId(),
clientSecrets.getDetails().getClientSecret(),
authCode,
"")
.execute();
log("hasRefresh == " + (tokenResponse.getRefreshToken() != null));
log("Exchanging authCode: " + authCode + " for token");
Credential credential = new Credential
.Builder(BearerToken.authorizationHeaderAccessMethod())
.setJsonFactory(JacksonFactory.getDefaultInstance())
.setTransport(HTTPTransport)
.setTokenServerEncodedUrl("https://www.googleapis.com/oauth2/v4/token")
.setClientAuthentication(new HttpExecuteInterceptor() {
@Override
public void intercept(HttpRequest request)
throws IOException {
}
})
.build()
.setFromTokenResponse(tokenResponse);
player.setCredential(credential);
// Now that we have a credential, we can access the Games API.
PlayGamesAPI api = new PlayGamesAPI(player, applicationId,
HTTPTransport, JacksonFactory.getDefaultInstance());
// Call the verify method, which checks that the access token has
// access to the Games API, and that the player id used by the
// client matches the playerId associated with the accessToken.
boolean ok = api.verifyPlayer();
// Call a Games API on the server.
if (ok) {
ok = api.updatePlayerInfo();
if (ok) {
// persist the player.
savePlayer(api.getPlayer());
}
}
return ok ? HttpServletResponse.SC_OK :
HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
} catch (IOException e) {
e.printStackTrace();
}
return HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
}
Untuk mempelajari lebih lanjut cara mengakses Google API dari server backend atas nama pemain yang login, lihat Mengaktifkan Akses Sisi Server.
Menangani logout pemain
Untuk logout pemain dari game, panggil metode signOut()
di GoogleSignInClient
. Untuk
contoh cuplikan kode, lihat
Menonaktifkan pemain.
Memanggil REST API dari server
Lihat REST API untuk layanan game Google Play guna mendapatkan deskripsi lengkap tentang panggilan API yang tersedia.
Contoh panggilan REST API yang mungkin berguna bagi Anda meliputi hal berikut:
Pemain
- Ingin mendapatkan ID dan data profil pemain yang login? Panggil Players.get
dengan
'me'
sebagai ID.
Teman
Pastikan Anda meninjau panduan Teman, yang menjelaskan Teman secara lebih mendetail.
- Ingin mengambil daftar teman pemain? Panggil Players.list dengan
'friends_all'
sebagaicollection
. - Memeriksa apakah Anda memiliki akses ke daftar teman? Panggil Players.get untuk
me
, dan lihat kolomprofileSettings.friendsListVisibility
dalam respons.
Pencapaian
Pastikan Anda meninjau panduan Pencapaian, yang menjelaskan pencapaian secara lebih mendetail.
- Ingin mendapatkan daftar pencapaian saat ini? Anda dapat melakukan panggilan ke AchievementDefinitions.list.
- Kombinasikan dengan panggilan ke Achievements.list untuk mencari tahu mana yang berhasil dibuka pemain.
- Apakah pemain mendapatkan pencapaian? Gunakan Achievements.unlock untuk meraihnya!
- Apakah pemain membuat progres menuju pencapaian parsial? Gunakan Achievements.increment untuk melaporkan progres (dan cari tahu apakah pemain berhasil membukanya).
- Apakah Anda men-debug game yang belum diproduksi? Coba panggil Achievements.reset atau Achievements.resetAll dari Management API untuk mereset pencapaian ke status semula.
Papan peringkat
Pastikan Anda meninjau panduan Papan Peringkat, yang menjelaskan papan peringkat secara lebih mendetail.
- Ingin mendapatkan daftar semua papan skor dalam game? Lakukan panggilan ke Leaderboards.list.
- Apakah pemain sudah selesai bermain game? Anda dapat mengirimkan skor mereka ke Scores.submit dan mencari tahu apakah skor tersebut merupakan skor tertinggi yang baru.
- Ingin menampilkan papan peringkat? Dapatkan data dari Scores.list dan tampilkan kepada pengguna.
- Gunakan Scores.listWindow untuk menemukan ragam skor yang mendekati skor tertinggi pengguna.
- Untuk mendapatkan informasi selengkapnya tentang skor pemain di papan peringkat tertentu (misalnya, jika pemain termasuk dalam 12% pemain teratas), panggil Scores.get.
- Apakah Anda men-debug game? Coba panggil Scores.reset dari Management API untuk mereset semua skor untuk pemain tersebut dari papan peringkat tertentu