Аутентификация в Unity с помощью игровых сервисов Google Play

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

Прежде чем начать

Настройте свой проект Unity

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

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

  2. В редакторе Unity в разделе «Настройки сборки» > «Настройки проигрывателя» > «Другие настройки» укажите имя пакета Android вашей игры.

  3. Затем в разделе «Настройки сборки» > «Настройки проигрывателя» > «Настройки публикации» выберите или создайте хранилище ключей и ключ, которые будут использоваться для подписи вашего пакета Android. Ваш APK должен быть подписан, чтобы вход в Play Игры работал. Это требование применяется не только при публикации, но и во время разработки игры.

Настройте свой проект Firebase

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

  2. Установите отпечаток SHA-1 вашей игры на странице настроек консоли Firebase , используя ключ, который вы установили в Unity.

    Вы можете получить отпечаток SHA-1 вашего ключа с помощью команды keytool :

    keytool -exportcert -list -v \
        -alias YOUR-KEY-NAME -keystore PATH-TO-KEYSTORE

    Альтернативно вы можете получить хэш SHA вашего сертификата подписи с помощью команды gradle signingReport :

    gradlew signingReport

    Ваш APK должен быть подписан этим ключом, в том числе во время разработки.

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

    1. В консоли Firebase откройте раздел Authentication .

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

      1. На вкладке «Метод входа» включите поставщика входа в систему Google .

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

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

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

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

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

  3. Нажмите «Да, моя игра уже использует Google API» , выберите свой проект 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 Games:

    1. Нажмите «Окно» > «Google Play Игры» > «Настройка» > «Настройка Android» , чтобы открыть экран «Конфигурация Android» .
    2. Вставьте фрагмент ресурсов Android, полученный из консоли Play, в поле «Определение ресурсов» .
    3. Вставьте идентификатор клиента веб-сервера, который вы указали при включении входа в Play Игры в консоли Firebase , в поле «Идентификатор клиента» .
    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 Games, в обработчике продолжения входа получите код авторизации для учетной записи игрока:

    Social.localUser.Authenticate((bool success) => {
      if (success) {
        authCode = PlayGamesPlatform.Instance.GetServerAuthCode();
      }
    });
    
  2. Затем замените код авторизации из сервисов Play Games на учетные данные Firebase и используйте учетные данные 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 Games. Эта новая учетная запись хранится как часть вашего проекта 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 вы можете получить уникальный идентификатор пользователя, вошедшего в систему, из переменной auth и использовать его для управления тем, к каким данным пользователь может получить доступ.

Чтобы получить информацию об игроке Play Games пользователя или получить доступ к сервисам Play Games, используйте API, предоставляемые плагином Play Games.

Чтобы выйти из системы, вызовите SignOut() :

auth.SignOut();