Sebaiknya Anda mengautentikasi pemain dan meneruskan identitas pemain dengan aman ke server backend. Dengan begitu, game Anda dapat mengambil identitas pemain dan data lainnya dengan aman tanpa mengalami potensi gangguan saat melewati perangkat.
Dalam skenario ini, setelah pemain berhasil login, Anda dapat meminta kode sekali pakai khusus (disebut kode autentikasi server) dari SDK Layanan game Play v2, yang diteruskan klien ke server. Kemudian, pada 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 untuk Game Android.
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
Pertama, Anda harus menambahkan game di Konsol Google Play, seperti yang dijelaskan dalam Menyiapkan Layanan Game Google Play, dan mengintegrasikan Login Layanan game Play dengan game Anda.
Membuat aplikasi web sisi server
Layanan game Google Play tidak menyediakan dukungan backend untuk game Web. Namun, layanan ini menyediakan dukungan server backend untuk server game Android Anda.
Jika Anda ingin menggunakan REST API untuk Layanan game Google Play di aplikasi sisi server, ikuti langkah-langkah berikut:
- Di Konsol Google Play, pilih game.
- Buka Layanan game Play > Penyiapan dan pengelolaan > Konfigurasi.
- Pilih Tambahkan kredensial untuk diarahkan ke halaman Tambahkan kredensial.
Pilih Server game sebagai jenis kredensial, lalu lanjutkan ke
bagian Otorisasi.
- Jika server game Anda sudah memiliki client ID OAuth, pilih dari menu drop-down. Setelah menyimpan perubahan, lanjutkan ke bagian berikutnya.
- Jika belum memiliki client ID OAuth untuk server game, Anda dapat membuatnya.
- Klik Buat klien OAuth, lalu ikuti link Buat Client ID OAuth.
- Tindakan ini akan membuka halaman Buat Client ID OAuth Google Cloud Platform untuk project yang terkait dengan game Anda.
- Isi formulir halaman, lalu klik buat. Pastikan untuk menetapkan jenis Aplikasi ke Aplikasi web.
- Kembali ke bagian Otorisasi dari halaman Tambahkan kredensial, pilih klien OAuth yang baru dibuat, lalu simpan perubahan Anda.
Mendapatkan kode autentikasi server
Untuk mengambil kode autentikasi server yang dapat digunakan game Anda untuk token akses di server backend:
Panggil
requestServerSideAccess
dari klien.- Pastikan Anda menggunakan Client ID OAuth yang terdaftar untuk server game dan bukan Client ID OAuth aplikasi Android Anda.
- (Opsional) Jika server game Anda memerlukan akses offline (akses berdurasi panjang menggunakan token refresh) ke Layanan game Play, Anda dapat menyetel parameter forceRefreshToken ke true.
GamesSignInClient gamesSignInClient = PlayGames.getGamesSignInClient(this); gamesSignInClient .requestServerSideAccess(OAUTH_2_WEB_CLIENT_ID, /* forceRefreshToken= */ false) .addOnCompleteListener( task -> { if (task.isSuccessful()) { String serverAuthToken = task.getResult(); // Send authentication code to the backend game server to be // exchanged for an access token and used to verify the player // via the Play Games Services REST APIs. } else { // Failed to retrieve authentication code. } });
Kirim token kode autentikasi OAuth ke server backend Anda agar dapat ditukarkan, ID Pemain yang diverifikasi dengan REST API Layanan game Play, lalu diautentikasi dengan game Anda.
Mengirim kode autentikasi server
Kirim kode autentikasi server ke server backend Anda untuk ditukar dengan token akses dan token refresh. Gunakan token akses untuk memanggil 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 ini 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 shouldn't 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;
}
Memanggil REST API dari server
Lihat REST API untuk layanan game Google Play untuk deskripsi lengkap 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
Lihat panduan Teman untuk mengetahui detailnya.
Untuk mengambil daftar teman pemain, panggil Players.list dengan
friends_all
sebagaicollection
.Untuk memverifikasi apakah Anda memiliki akses ke daftar teman, panggil Players.get dengan
me
sebagaiplayerID
, dan lihat kolomprofileSettings.friendsListVisibility
dalam respons.
Pencapaian
Lihat panduan Pencapaian untuk detailnya.
Untuk mendapatkan daftar pencapaian saat ini, panggil AchievementDefinitions.list.
Kombinasikan dengan panggilan ke Achievements.list untuk mencari tahu mana yang berhasil dibuka pemain.
Panggil Achievements.unlock untuk membuka pencapaian pemain.
Panggil Achievements.increment untuk melaporkan progres berdasarkan pencapaian, dan cari tahu apakah pemain berhasil membukanya.
Jika men-debug game yang belum mencapai produksi, Anda dapat memanggil Achievements.reset atau Achievements.resetAll dari Management API untuk mereset pencapaian ke status semula.
Papan Peringkat
Lihat panduan Papan Peringkat untuk mengetahui detailnya.
Ingin mendapatkan daftar semua papan skor dalam game? Lakukan panggilan ke Leaderboards.list.
Jika pemain selesai bermain game, Anda dapat mengirimkan skor mereka ke Scores.submit dan mencari tahu apakah skor tersebut merupakan skor tertinggi yang baru.
Untuk menampilkan papan peringkat, dapatkan data dari Scores.list, lalu 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.
Jika men-debug game, Anda dapat memanggil Scores.reset dari Management API untuk mereset semua skor untuk pemain tersebut dari papan peringkat tertentu.