Игровые сервисы Google Play позволяют пользователям входить в аккаунт в играх для Android, созданных на основе Firebase и Unity. Чтобы использовать вход через сервисы Google Play Games с Firebase, сначала войдите в аккаунт игрока через сервисы Google Play Games и запросите код авторизации OAuth 2.0. Затем передайте код авторизации в PlayGamesAuthProvider, чтобы создать учетные данные Firebase, которые можно использовать для аутентификации в Firebase.
Подготовка
Как настроить проект Unity
Добавьте в проект Unity файл конфигурации Firebase и SDK Firebase Unity, как описано в статье Как добавить Firebase в проект Unity. Следуйте инструкциям для Android.
Обязательно импортируйте
FirebaseAuth.unitypackage.В редакторе Unity выберите Build Settings > Player Settings > Other Settings и укажите название пакета Android для игры.
Затем в разделе Build Settings > Player Settings > Publishing Settings выберите или создайте хранилище ключей и ключ, которые будут использоваться для подписи пакета Android. Чтобы вход в аккаунт Play Games работал, APK-файл должен быть подписан. Это требование действует не только при публикации, но и при разработке игры.
Как настроить проект Firebase
В консоли Firebase перейдите к проекту Firebase, в котором вы зарегистрировали проект Unity.
Укажите цифровой отпечаток SHA-1 для игры.
В консоли Firebase перейдите на вкладку
Настройки > Общие.Прокрутите страницу вниз до карточки Ваши приложения, выберите приложение Android и добавьте цифровой отпечаток SHA-1 в поле Цифровые отпечатки сертификата SHA.
Получить отпечаток SHA-1 ключа можно с помощью команды
keytool:keytool -exportcert -list -v \ -alias YOUR-KEY-NAME -keystore PATH-TO-KEYSTOREВы также можете получить хеш SHA сертификата подписи с помощью команды gradle
signingReport:gradlew signingReport
О том, как получить цифровой отпечаток SHA приложения, можно прочитать в разделе об аутентификации клиентов.
Ваш APK-файл должен быть подписан этим ключом, в том числе во время разработки.
Включите Google Play Games в качестве поставщика услуг входа:
В консоли Firebase выберите Безопасность > Аутентификация.
Создайте и получите идентификатор клиента веб-сервера и секрет клиента для своего проекта:
На вкладке Способ входа включите поставщика услуг входа Google.
Скопируйте идентификатор и секретный код клиента веб-сервера у поставщика услуг входа через Google.
На вкладке Способ входа включите поставщика услуг входа Play Games и укажите идентификатор клиента и секретный код клиента веб-сервера проекта, полученные на предыдущем шаге.
Настройте Play Games services, используя информацию о приложении Firebase
В консоли Google Play откройте приложение Google Play или создайте его.
В разделе Развитие нажмите Play Games services > Настройка и управление > Конфигурация.
Нажмите Да, в моей игре уже используются API Google, выберите проект Firebase из списка и нажмите Использовать.
На странице конфигурации Play Games services нажмите Добавить учетные данные.
- Выберите тип Игровой сервер.
- В поле Клиент OAuth выберите идентификатор веб-клиента проекта. Убедитесь, что это тот же идентификатор клиента, который вы указали при включении входа через Play Games.
- Сохраните изменения.
На странице конфигурации Play Games services снова нажмите Добавить учетные данные.
- Выберите тип Android.
- В поле Клиент OAuth выберите идентификатор клиента Android для своего проекта. Если вы не видите идентификатор клиента Android, убедитесь, что отпечаток SHA-1 игры задан в консоли Firebase.
- Сохраните изменения.
На страницах События, Достижения и Таблицы лидеров создайте ресурсы, которые вы хотите использовать в игре (если вы не хотите использовать их сразу, можно создать запись-заполнитель).Play Games Затем на любой из страниц События, Достижения или Таблицы лидеров нажмите Получить ресурсы и скопируйте фрагмент кода ресурсов Android в удобное место. Фрагмент кода понадобится вам для настройки плагина Google Play Games services.
Фрагмент кода ресурсов выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?> <!-- Google Play game services IDs. Save this file as res/values/games-ids.xml in your project. --> <resources> <!-- app_id --> <string name="app_id" translatable="false">123456789000</string> <!-- package_name --> <string name="package_name" translatable="false">com.example.game</string> <!-- event Wiped Raid --> <string name="event_wiped_raid" translatable="false">CgkIpKjv1a4PEAIYBA</string> </resources>На странице Тестировщики добавьте адреса электронной почты пользователей, которым нужно предоставить доступ к игре до ее выпуска в Play Store.
Как добавить в игру вход через Play Игры
Скачайте последнюю версию плагина Play Games для Unity и извлеките ее.
Импортируйте пакет Unity плагина в свой проект Unity. Пакет Unity можно найти в каталоге
current-buildархива выпуска.Настройте плагин Play Игр:
- Нажмите Window > Google Play Games > Setup > Android Setup (Окно > Google Play Games > Настройка > Настройка Android), чтобы открыть экран Android Configuration (Настройка Android).
- Вставьте фрагмент кода ресурсов Android, полученный в Play Console, в поле Определение ресурсов.
- Вставьте идентификатор клиента веб-сервера, который вы указали при включении входа через Play Games в Firebase Console, в поле Идентификатор клиента.
- Нажмите Настройка.
В игре настройте клиент Play Games с включенным параметром
RequestServerAuthCode:using GooglePlayGames; using GooglePlayGames.BasicApi; using UnityEngine.SocialPlatforms; using System.Threading.Tasks; PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder() .RequestServerAuthCode(false /* Don't force refresh */) .Build(); PlayGamesPlatform.InitializeInstance(config); PlayGamesPlatform.Activate();Затем, когда игрок решит войти в игру через Play Games, вызовите функцию
Social.localUser.Authenticate():Social.localUser.Authenticate((bool success) => { // handle success or failure });
Как пройти аутентификацию с помощью Firebase
После того как вы добавите в игру вход через Play Games, вы сможете использовать код авторизации из сервисов Play Games для аутентификации в Firebase.
После того как игрок успешно войдет в аккаунт через Play Игры, в обработчике продолжения входа получите код авторизации для аккаунта игрока:
Social.localUser.Authenticate((bool success) => { if (success) { authCode = PlayGamesPlatform.Instance.GetServerAuthCode(); } });Затем обменяйте код авторизации из сервисов Play Игр на учетные данные Firebase и используйте их для аутентификации игрока:
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance; Firebase.Auth.Credential credential = Firebase.Auth.PlayGamesAuthProvider.GetCredential(authCode); auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => { if (task.IsCanceled) { Debug.LogError("SignInAndRetrieveDataWithCredentialAsync was canceled."); return; } if (task.IsFaulted) { Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " + task.Exception); return; } Firebase.Auth.AuthResult result = task.Result; Debug.LogFormat("User signed in successfully: {0} ({1})", result.User.DisplayName, result.User.UserId); });
Дальнейшие действия
После первого входа пользователя создается новый аккаунт и связывается с его идентификатором Play Игр. Новый аккаунт хранится в проекте Firebase и позволяет идентифицировать пользователя во всех приложениях проекта.
В игре можно получить UID пользователя Firebase из объекта Firebase.Auth.FirebaseUser:
Firebase.Auth.FirebaseUser user = auth.CurrentUser;
if (user != null && user.IsValid()) {
string playerName = user.DisplayName;
// The user's Id, unique to the Firebase project.
// Do NOT use this value to authenticate with your backend server, if you
// have one; use User.TokenAsync() instead.
string uid = user.UserId;
}
В правилах безопасности для базы данных Firebase Realtime Database и Cloud Storage можно получить уникальный идентификатор вошедшего в аккаунт пользователя из переменной auth и использовать его, чтобы контролировать доступ пользователя к данным.
Чтобы получить информацию об игроке Play Games или доступ к сервисам Play Games, используйте API, предоставляемые плагином Play Games.
Чтобы выйти из аккаунта пользователя, вызовите функцию SignOut():
auth.SignOut();