В связи с прекращением поддержки API Google Sign-In , мы удаляем SDK для игр версии 1 в 2026 году. После февраля 2025 года вы не сможете публиковать в Google Play игры, которые были интегрированы с SDK для игр версии 1. Мы рекомендуем использовать вместо него SDK для игр версии 2.
Хотя существующие игры с интеграцией предыдущих версий v1 будут продолжать работать еще пару лет, мы рекомендуем перейти на версию v2, начиная с июня 2025 года.
Данное руководство предназначено для использования SDK Play Games Services v1. Информацию о последней версии SDK см. в документации v2 .
Если ваша игра использует серверную часть, мы рекомендуем использовать Google Sign-In для аутентификации игроков и безопасной передачи их идентификационных данных на сервер. Это также позволит вашей игре безопасно получать идентификационные данные игрока и другую информацию, исключая возможность её несанкционированного доступа при передаче через устройство.
В этом сценарии ваша игра предлагает игроку войти в Google Play Games Services как обычно. После успешного входа игрока объект GoogleSignInAccount содержит специальный одноразовый код (называемый кодом авторизации сервера ), который клиент передает серверу. Затем на сервере происходит обмен кода авторизации сервера на токен OAuth 2.0, который сервер может использовать для выполнения вызовов к API Google Play Games Services.
Дополнительные инструкции по добавлению авторизации в ваши игры см. в разделе «Авторизация в играх для Android» .
Чтобы увидеть подробный пример кода, демонстрирующий использование Google Sign-In для аутентификации игроков, см. пример clientserverskeleton на GitHub.
Для доступа в автономном режиме необходимо выполнить следующие шаги:
- В консоли Google Play: создайте учетные данные для вашего игрового сервера. Тип OAuth-клиента в учетных данных будет "web".
- В приложении для Android: при входе в систему запросите код авторизации сервера для учетных данных вашего сервера и передайте его на ваш сервер.
- На вашем игровом сервере: обменяйте код авторизации сервера на токен доступа OAuth, используя сервисы аутентификации Google, а затем используйте его для вызова REST API сервисов Play Games.
Прежде чем начать
Прежде чем интегрировать вход через Google в свою игру, вам сначала нужно добавить свою игру в консоль Google Play , как описано в разделе «Настройка сервисов Google Play Games» .
Создайте связанное с вашей игрой серверное веб-приложение.
Сервисы Google Play Game не предоставляют серверную поддержку для веб-игр. Однако они обеспечивают серверную поддержку для вашей игры на Android.
Если вы хотите использовать REST API для сервисов Google Play Games в своем серверном приложении, выполните следующие шаги:
- Создайте связанное веб-приложение для вашей игры в разделе «Связанные приложения» консоли Google Play . Обратите внимание, что параметр
launch_urlв этом процессе не используется и может быть оставлен пустым. - Чтобы получить учетные данные для вашего приложения, выполните следующие действия:
- В консоли Google Play, в разделе «Подробности игры», нажмите «Сведения об игре» .
- Прокрутите страницу вниз до раздела «Проект консоли API» и щелкните ссылку на проект консоли API.
- В консоли Google API на экране API & Services > Credentials загрузите файл
client_secret.jsonдля вашего веб-приложения и сохраните его в месте, доступном для вашего сервера. Запишите идентификатор клиента (client ID) учетных данных для дальнейшего использования.
- Перезапустите серверное приложение, чтобы оно было готово принимать запросы от клиентского приложения вашей игры.
Perform sign-in on the client
Класс GoogleSignInClient является основной точкой входа для получения учетной записи текущего авторизованного игрока и для авторизации игрока, если он ранее не авторизовался в вашем приложении на устройстве.
To create a sign-in client, follow these steps:
- Создайте клиент для авторизации с помощью объекта
GoogleSignInOptions. ВGoogleSignInOptions.Builderдля настройки авторизации необходимо указатьGoogleSignInOptions.DEFAULT_GAMES_SIGN_IN. - Также необходимо указать, что для вашей игры требуется код авторизации для вашего бэкэнд-сервера, вызвав метод
GoogleSignInOptions.Builder.requestServerAuthCode()с идентификатором клиента сервера в качестве параметра. Вы получите код авторизации позже для токенов доступа на вашем бэкэнд-сервере, как описано в разделе «Получение кода авторизации сервера» . - Вызовите метод
GoogleSignIn.getClient()и передайте в него ранее настроенные параметры. В случае успешного вызова API входа в систему Google вернет экземплярGoogleSignInClient. - Получив экземпляр
GoogleSignInClient, следует выполнить бесшумный вход в систему из методаonResume()активности, как описано в разделе «Выполнение бесшумного входа в систему» .
Вот пример:
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);
}Get the server auth code
Чтобы получить код авторизации сервера, который ваша игра может использовать в качестве токенов доступа на вашем бэкэнд-сервере, вызовите метод getServerAuthCode() объекта GoogleSignInAccount , который возвращает Google Sign-In после успешного входа игрока в систему.
Вот пример:
// 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(); } } }
Обменяйте код авторизации сервера на токен доступа на сервере.
Отправьте код авторизации сервера на свой бэкэнд-сервер для обмена на токены доступа и обновления. Используйте токен доступа для вызова API сервисов Google Play Games от имени игрока и, при необходимости, сохраните токен обновления для получения нового токена доступа по истечении срока действия предыдущего.
Приведённый ниже фрагмент кода демонстрирует, как можно реализовать серверный код на языке программирования Java для обмена кода аутентификации сервера на токены доступа. В нём используется пример приложения 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;
}
Чтобы узнать больше о доступе к API Google с серверной части от имени авторизованного игрока, см. раздел «Включение доступа на стороне сервера» .
Handle player sign-out
Чтобы выйти из игры, вызовите метод signOut() объекта GoogleSignInClient . Пример кода см. в разделе «Выход игрока из игры ».
Call REST APIs from the server
Полное описание доступных вызовов API см. в разделе REST API для сервисов Google Play Games .
Примеры полезных вызовов REST API включают следующее:
Игрок
- Хотите получить ID и данные профиля вошедшего в систему игрока? Вызовите метод Players.get, указав в качестве ID значение
'me'.
Друзья
Обязательно ознакомьтесь с руководством по сериалу «Друзья» , где более подробно объясняется, что это за сериал.
- Хотите получить список друзей игрока? Вызовите метод Players.list , указав в качестве
collection'friends_all'. - Проверьте, есть ли у вас доступ к списку друзей?
mePlayers.get и посмотрите на полеprofileSettings.friendsListVisibilityв ответе.
Достижения
Обязательно ознакомьтесь с руководством по достижениям , где более подробно описано, что такое достижения.
- Хотите получить список текущих достижений? Вы можете обратиться к AchievementDefinitions.list .
- Добавьте к этому обращение к Achievements.list , чтобы узнать, какие достижения игрок разблокировал.
- Получил ли игрок достижение? Используйте Achievements.unlock , чтобы разблокировать его!
- Достиг ли игрок частичного прогресса в получении достижения? Используйте Achievements.increment , чтобы сообщить о прогрессе (и узнать, разблокировал ли игрок достижение).
- Вы отлаживаете игру, которая ещё не запущена в производство? Попробуйте вызвать Achievements.reset или Achievements.resetAll из API управления, чтобы сбросить достижения до их исходного состояния.
Таблицы лидеров
Обязательно ознакомьтесь с руководством по таблицам лидеров , где более подробно объясняется, как работают таблицы лидеров.
- Хотите получить список всех таблиц результатов в игре? Воспользуйтесь сайтом Leaderboards.list .
- Игрок завершил игру? Вы можете отправить его результат на Scores.submit и узнать, является ли это новым рекордом.
- Хотите отобразить таблицу лидеров? Получите данные из Scores.list и покажите их пользователю.
- Используйте Scores.listWindow , чтобы найти подборку результатов, близких к рекорду пользователя.
- Чтобы получить более подробную информацию о результатах игрока в конкретной таблице лидеров (например, если игрок входит в 12% лучших игроков), вызовите метод Scores.get .
- Вы отлаживаете игру? Попробуйте вызвать метод Scores.reset из API управления, чтобы сбросить все результаты этого игрока в конкретной таблице лидеров.