Как настроить аутентификацию в Unity с помощью сервисов Google Play Игр

Игровые сервисы Google Play позволяют пользователям входить в аккаунт в играх для Android, созданных на основе Firebase и Unity. Чтобы использовать вход через сервисы Google Play Games с Firebase, сначала войдите в аккаунт игрока через сервисы Google Play Games и запросите код авторизации OAuth 2.0. Затем передайте код авторизации в PlayGamesAuthProvider, чтобы создать учетные данные Firebase, которые можно использовать для аутентификации в Firebase.

Подготовка

Как настроить проект Unity

  1. Добавьте в проект Unity файл конфигурации Firebase и SDK Firebase Unity, как описано в статье Как добавить Firebase в проект Unity. Следуйте инструкциям для Android.

    Обязательно импортируйте FirebaseAuth.unitypackage.

  2. В редакторе Unity выберите Build Settings > Player Settings > Other Settings и укажите название пакета Android для игры.

  3. Затем в разделе Build Settings > Player Settings > Publishing Settings выберите или создайте хранилище ключей и ключ, которые будут использоваться для подписи пакета Android. Чтобы вход в аккаунт Play Games работал, APK-файл должен быть подписан. Это требование действует не только при публикации, но и при разработке игры.

Как настроить проект Firebase

  1. В консоли Firebase перейдите к проекту Firebase, в котором вы зарегистрировали проект Unity.

  2. Укажите цифровой отпечаток SHA-1 для игры.

    1. В консоли Firebase перейдите на вкладку Настройки > Общие.

    2. Прокрутите страницу вниз до карточки Ваши приложения, выберите приложение 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-файл должен быть подписан этим ключом, в том числе во время разработки.

  3. Включите Google Play Games в качестве поставщика услуг входа:

    1. В консоли Firebase выберите Безопасность > Аутентификация.

    2. Создайте и получите идентификатор клиента веб-сервера и секрет клиента для своего проекта:

      1. На вкладке Способ входа включите поставщика услуг входа Google.

      2. Скопируйте идентификатор и секретный код клиента веб-сервера у поставщика услуг входа через Google.

    3. На вкладке Способ входа включите поставщика услуг входа Play Games и укажите идентификатор клиента и секретный код клиента веб-сервера проекта, полученные на предыдущем шаге.

Настройте Play Games services, используя информацию о приложении Firebase

  1. В консоли Google Play откройте приложение Google Play или создайте его.

  2. В разделе Развитие нажмите Play Games services > Настройка и управление > Конфигурация.

  3. Нажмите Да, в моей игре уже используются API Google, выберите проект Firebase из списка и нажмите Использовать.

  4. На странице конфигурации Play Games services нажмите Добавить учетные данные.

    1. Выберите тип Игровой сервер.
    2. В поле Клиент OAuth выберите идентификатор веб-клиента проекта. Убедитесь, что это тот же идентификатор клиента, который вы указали при включении входа через Play Games.
    3. Сохраните изменения.
  5. На странице конфигурации Play Games services снова нажмите Добавить учетные данные.

    1. Выберите тип Android.
    2. В поле Клиент OAuth выберите идентификатор клиента Android для своего проекта. Если вы не видите идентификатор клиента Android, убедитесь, что отпечаток SHA-1 игры задан в консоли Firebase.
    3. Сохраните изменения.
  6. На страницах События, Достижения и Таблицы лидеров создайте ресурсы, которые вы хотите использовать в игре (если вы не хотите использовать их сразу, можно создать запись-заполнитель).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>
    
  7. На странице Тестировщики добавьте адреса электронной почты пользователей, которым нужно предоставить доступ к игре до ее выпуска в Play Store.

Как добавить в игру вход через Play Игры

  1. Скачайте последнюю версию плагина Play Games для Unity и извлеките ее.

  2. Импортируйте пакет Unity плагина в свой проект Unity. Пакет Unity можно найти в каталоге current-build архива выпуска.

  3. Настройте плагин Play Игр:

    1. Нажмите Window > Google Play Games > Setup > Android Setup (Окно > Google Play Games > Настройка > Настройка Android), чтобы открыть экран Android Configuration (Настройка Android).
    2. Вставьте фрагмент кода ресурсов Android, полученный в Play Console, в поле Определение ресурсов.
    3. Вставьте идентификатор клиента веб-сервера, который вы указали при включении входа через Play Games в Firebase Console, в поле Идентификатор клиента.
    4. Нажмите Настройка.
  4. В игре настройте клиент 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();
    
  5. Затем, когда игрок решит войти в игру через Play Games, вызовите функцию Social.localUser.Authenticate():

    Social.localUser.Authenticate((bool success) => {
      // handle success or failure
    });
    

Как пройти аутентификацию с помощью Firebase

После того как вы добавите в игру вход через Play Games, вы сможете использовать код авторизации из сервисов Play Games для аутентификации в Firebase.

  1. После того как игрок успешно войдет в аккаунт через Play Игры, в обработчике продолжения входа получите код авторизации для аккаунта игрока:

    Social.localUser.Authenticate((bool success) => {
      if (success) {
        authCode = PlayGamesPlatform.Instance.GetServerAuthCode();
      }
    });
    
  2. Затем обменяйте код авторизации из сервисов 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();