Аутентификация с помощью функции "Войти с аккаунтом Google" и Unity

Вы можете разрешить пользователям проходить аутентификацию в Firebase с помощью аккаунтов Google, интегрировав в приложение функцию входа через Google.

Подготовка

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

Чтобы использовать Firebase Authentication, необходимо:

  • Зарегистрируйте проект Unity и настройте его для использования Firebase.

    • Если в проекте уже используется Firebase, можете пропустить этот шаг.

    • Если у вас нет проекта Unity, вы можете скачать пример приложения.

  • Добавьте в свой проект Unity Firebase Unity SDK (в частности, FirebaseAuth.unitypackage).

Обратите внимание, что для добавления Firebase в проект Unity нужно выполнить действия как в консоли Firebase, так и в вашем открытом проекте Unity. Например, вам потребуется скачать файлы конфигурации Firebase из консоли, а затем переместить их в проект Unity.

Как настроить проект Firebase и учетные данные

  1. Android. Укажите цифровой отпечаток SHA-1 приложения в консоли Firebase.

    1. В консоли Firebase выберите Settings (Настройки) > General (Общие).
    2. Перейдите к карточке Ваши приложения, выберите приложение для Android и добавьте цифровой отпечаток SHA-1 в поле Цифровые отпечатки сертификата SHA.

      Чтобы получить цифровой отпечаток SHA-1 хранилища ключей, используйте keytool:

      keytool -keystore path-to-keystore.keystore -list -v
      

      Подробнее о том, как получить цифровой отпечаток SHA приложения, читайте в разделе об аутентификации клиентов.

  2. Включите вход с аккаунтом Google и скопируйте идентификатор веб-клиента:

    1. В консоли Firebase выберите Безопасность > Аутентификация.
    2. На вкладке Sign-in method (Способ входа) включите поставщика аутентификации Google.
    3. Разверните раздел Конфигурация Web SDK и скопируйте идентификатор веб-клиента (например, 123456-abc.apps.googleusercontent.com). Он представляет собой утверждение аудитории (aud) ваших токенов идентификации и требуется как для Android, так и для iOS.
    4. Нажмите Сохранить.
  3. Обновите файлы конфигурации Firebase и скопируйте обратный идентификатор клиента iOS:

    1. Скачайте последние файлы конфигурации Firebase из консоли Firebase (google-services.json для Android и GoogleService-Info.plist для iOS) и замените ими старые копии в проекте Unity. Подробнее о том, как добавить Firebase в проект Unity…
    2. iOS. Откройте файл GoogleService-Info.plist и скопируйте значение ключа REVERSED_CLIENT_ID (например, com.googleusercontent.apps.12345-abc). Это значение необходимо для настройки схемы URL перенаправления iOS.

Интегрируйте плагин входа с аккаунтом Google в проект Unity

  1. Импортируйте плагин:

    1. Если вы интегрируете плагин в существующий проект, создайте резервную копию проекта и удалите все старые плагины входа с аккаунтом Google, прежде чем продолжить.
    2. Скачайте GoogleSignInNative.unitypackage из GitHub и импортируйте его в проект Unity (Assets > Import Package > Custom Package). Убедитесь, что выбраны все файлы, и нажмите Импортировать.
  2. Задайте настройки плагина:

    1. В Unity Editor выберите Window (Окно) > Google Sign-In Native (Вход с аккаунтом Google) > Settings (Настройки).
    2. Вставьте идентификатор веб-клиента в первое поле.
    3. Вставьте обратный идентификатор клиента iOS во второе поле.
    4. Нажмите Save Settings (Сохранить настройки).
  3. Разрешите нативные зависимости:

    1. Выберите Assets (Объекты) > External Dependency Manager (Менеджер внешних зависимостей) > Android Resolver (Разрешение зависимостей Android) > Force Resolve (Принудительное разрешение).
    2. Дождитесь сообщения об успешном завершении. Будут скачаны нативные библиотеки googleid и androidx Менеджера учетных данных.

Доступ к курсу "Firebase.Auth.FirebaseAuth"

Класс FirebaseAuth является шлюзом для всех вызовов API. Доступ к нему можно получить через FirebaseAuth.DefaultInstance.
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

Как выполнить аутентификацию с помощью Firebase

  1. Настройте GoogleSignInManager в сцене:

    1. Создайте пустой объект GameObject в начальной сцене и назовите его GoogleSignInManager.
    2. Прикрепите к нему скрипт GoogleSignInManager.cs.
    3. Перетащите объект GoogleSignInNativeSettings (находится в Assets/GoogleSignInNative/Resources) в слот Sign In Settings (Настройки входа) в скрипте.
  2. Активируйте вход с аккаунтом Google и обменяйте токен идентификатора на учетные данные Firebase:

    Создайте скрипт контроллера, который подписывается на GoogleSignInManager.OnSignInCompleted и GoogleSignInManager.OnSignInFailed, запускает вход с помощью GoogleSignInManager.Instance.StartSignIn() и обменивает полученный токен идентификатора Google на учетные данные Firebase с помощью GoogleAuthProvider.GetCredential:

    using Firebase.Auth;
    using Firebase.Extensions;
    using UnityEngine;
    
    public class MyAuthController : MonoBehaviour
    {
        private FirebaseAuth auth;
    
        private void Awake()
        {
            auth = FirebaseAuth.DefaultInstance;
        }
    
        private void OnEnable()
        {
            GoogleSignInManager.OnSignInCompleted += HandleSignInSuccess;
            GoogleSignInManager.OnSignInFailed += HandleSignInFailure;
        }
    
        private void OnDisable()
        {
            GoogleSignInManager.OnSignInCompleted -= HandleSignInSuccess;
            GoogleSignInManager.OnSignInFailed -= HandleSignInFailure;
        }
    
        public void OnSignInButtonClick()
        {
            GoogleSignInManager.Instance.StartSignIn();
        }
    
        private void HandleSignInSuccess(string idToken)
        {
            Debug.Log("[Auth] Google Sign-In succeeded. Authenticating with Firebase...");
    
            Credential credential = GoogleAuthProvider.GetCredential(idToken, null);
            auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWithOnMainThread(task => {
                if (task.IsCanceled)
                {
                    Debug.LogError("SignInAndRetrieveDataWithCredentialAsync was canceled.");
                    return;
                }
                if (task.IsFaulted)
                {
                    Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " + task.Exception);
                    return;
                }
    
                AuthResult result = task.Result;
                Debug.LogFormat("User signed in successfully: {0} ({1})",
                    result.User.DisplayName, result.User.UserId);
            });
        }
    
        private void HandleSignInFailure(string error)
        {
            Debug.LogError($"[Auth] Google Sign-In failed: {error}");
        }
    }
    

Создайте приложение

Android

  • Убедитесь, что название пакета в настройках проигрывателя точно совпадает с учетными данными OAuth в Firebase и Google Cloud.
  • Убедитесь, что для параметра Minimum API Level (Минимальный уровень API) задано значение 34 или выше.
  • Нажмите Build and Run (Собрать и запустить).

iOS

  • Создайте проект в Unity, чтобы сгенерировать проект Xcode, а затем откройте созданный файл .xcworkspace.
  • В Xcode перейдите на вкладку Signing & Capabilities (Подписи и возможности) и выберите Development Team (Команда разработчиков).
  • Плагин автоматически добавляет специальную схему URL (REVERSED_CLIENT_ID) в проект Xcode. Выполните сборку и запуск на физическом устройстве.

Дальнейшие действия

После первого входа пользователя создается новый аккаунт, который связывается с учетными данными, то есть именем пользователя и паролем, номером телефона или информацией от поставщика аутентификации, с помощью которых пользователь вошел в систему. Этот новый аккаунт сохраняется в проекте Firebase и может использоваться для идентификации пользователя во всех приложениях проекта, независимо от того, как пользователь входит в систему.

  • В своих приложениях вы можете получить основную информацию профиля пользователя из объекта Firebase.Auth.FirebaseUser:

    Firebase.Auth.FirebaseUser user = auth.CurrentUser;
    if (user != null) {
      string name = user.DisplayName;
      string email = user.Email;
      System.Uri photo_url = user.PhotoUrl;
      // 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 и использовать его, чтобы управлять доступом к данным.

Вы можете разрешить пользователям входить в приложение с помощью нескольких поставщиков аутентификации, связав учетные данные поставщика аутентификации с существующим аккаунтом пользователя.

Чтобы выполнить выход пользователя, вызовите SignOut():

auth.SignOut();