Как пройти аутентификацию с помощью игровых сервисов Google Play на устройстве Android

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

Подготовка

Как настроить проект для Android

  1. Если вы ещё этого не сделали, добавьте Firebase в проект для Android.

  2. В файле Gradle модуля (на уровне приложения) (обычно <project>/<app-module>/build.gradle.kts или <project>/<app-module>/build.gradle) добавьте зависимость для библиотеки Firebase Authentication для Android. Мы рекомендуем использовать Firebase Android BoM для управления версиями библиотеки.

    Кроме того, при настройке Firebase Authentication вам нужно будет добавить в приложение SDK сервисов Google Play.

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:34.19.0"))
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:22.0.0")
    }

    Благодаря Firebase Android BoM в вашем приложении всегда будут использоваться совместимые версии библиотек Firebase Android.

    (Альтернативный вариант.) Добавьте зависимости библиотеки Firebase без использования BoM.

    Если вы не используете Firebase BoM, вам нужно указать версию каждой библиотеки Firebase в строке зависимости.

    Если в приложении используется несколько библиотек Firebase, мы настоятельно рекомендуем использовать BoM для управления версиями библиотек, чтобы обеспечить их совместимость.

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth:24.2.0")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:22.0.0")
    }

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

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

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

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

    ./gradlew signingReport

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

    1. Найдите идентификатор клиента и секретный код клиента веб-сервера проекта. Идентификатор клиента веб-сервера позволяет серверам аутентификации Google Play идентифицировать ваш проект Firebase.

      Чтобы найти эти значения:

      1. Откройте проект Firebase на странице учетных данных консоли Google API.
      2. В разделе Идентификаторы клиентов OAuth 2.0 откройте страницу сведений Веб-клиент (автоматически создан сервисом Google). На этой странице указаны идентификатор и секретный код клиента веб-сервера.
    2. Вернитесь в консоль Firebase и выберите Безопасность > Аутентификация.

    3. На вкладке Sign-in method (Способ входа) включите поставщика для входа через Play Games. Вам нужно будет указать идентификатор клиента веб-сервера и секретный код клиента, полученные в консоли API.

Настройте 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 Store.

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

Сначала добавьте в приложение функцию входа в аккаунт Google Play Игр. Подробные инструкции приведены в разделе Вход в аккаунт в играх для Android.

При создании объекта GoogleSignInOptions в интеграции используйте конфигурацию DEFAULT_GAMES_SIGN_IN и вызовите requestServerAuthCode:

Kotlin

val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
    .requestServerAuthCode(getString(R.string.default_web_client_id))
    .build()

Java

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
        .requestServerAuthCode(getString(R.string.default_web_client_id))
        .build();

В метод requestServerAuthCode необходимо передать идентификатор клиента веб-сервера. Это идентификатор, который вы указали при включении входа через Play Games в консоли Firebase.

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

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

  1. Сначала в методе onCreate объекта activity для входа получите общий экземпляр объекта FirebaseAuth:

    Kotlin

    private lateinit var auth: FirebaseAuth
    // ...
    // Initialize Firebase Auth
    auth = Firebase.auth

    Java

    private FirebaseAuth mAuth;
    // ...
    // Initialize Firebase Auth
    mAuth = FirebaseAuth.getInstance();
  2. При инициализации действия проверьте, вошел ли игрок в аккаунт Firebase:

    Kotlin

    override fun onStart() {
        super.onStart()
        // Check if user is signed in (non-null) and update UI accordingly.
        val currentUser = auth.currentUser
        updateUI(currentUser)
    }

    Java

    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        updateUI(currentUser);
    }

    Если игрок не вошел в аккаунт, предложите ему это сделать.

  3. После того как игрок войдет в аккаунт Play Игр в фоновом режиме или с помощью интерактивного запроса, получите код авторизации из объекта GoogleSignInAccount, обменяйте его на учетные данные Firebase и выполните аутентификацию в Firebase с помощью этих учетных данных:

    Kotlin

    // Call this both in the silent sign-in task's OnCompleteListener and in the
    // Activity's onActivityResult handler.
    private fun firebaseAuthWithPlayGames(acct: GoogleSignInAccount) {
        Log.d(TAG, "firebaseAuthWithPlayGames:" + acct.id!!)
    
        val auth = Firebase.auth
        val credential = PlayGamesAuthProvider.getCredential(acct.serverAuthCode!!)
        auth.signInWithCredential(credential)
            .addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    // Sign in success, update UI with the signed-in user's information
                    Log.d(TAG, "signInWithCredential:success")
                    val user = auth.currentUser
                    updateUI(user)
                } else {
                    // If sign in fails, display a message to the user.
                    Log.w(TAG, "signInWithCredential:failure", task.exception)
                    Toast.makeText(
                        baseContext,
                        "Authentication failed.",
                        Toast.LENGTH_SHORT,
                    ).show()
                    updateUI(null)
                }
    
                // ...
            }
    }

    Java

    // Call this both in the silent sign-in task's OnCompleteListener and in the
    // Activity's onActivityResult handler.
    private void firebaseAuthWithPlayGames(GoogleSignInAccount acct) {
        Log.d(TAG, "firebaseAuthWithPlayGames:" + acct.getId());
    
        final FirebaseAuth auth = FirebaseAuth.getInstance();
        AuthCredential credential = PlayGamesAuthProvider.getCredential(acct.getServerAuthCode());
        auth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            // Sign in success, update UI with the signed-in user's information
                            Log.d(TAG, "signInWithCredential:success");
                            FirebaseUser user = auth.getCurrentUser();
                            updateUI(user);
                        } else {
                            // If sign in fails, display a message to the user.
                            Log.w(TAG, "signInWithCredential:failure", task.getException());
                            Toast.makeText(MainActivity.this, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();
                            updateUI(null);
                        }
    
                        // ...
                    }
                });
    }

    Если вызов signInWithCredential выполнен успешно, вы можете использовать метод getCurrentUser, чтобы получить данные аккаунта пользователя.

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

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

В игре можно получить UID пользователя Firebase из объекта FirebaseUser:

Kotlin

val user = auth.currentUser
user?.let {
    val playerName = it.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 FirebaseUser.getIdToken() instead.
    val uid = it.uid
}

Java

FirebaseUser user = mAuth.getCurrentUser();
String playerName = user.getDisplayName();

// 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 FirebaseUser.getIdToken() instead.
String uid = user.getUid();

В правилах безопасности для базы данных Firebase Realtime Database и Cloud Storage можно получить уникальный идентификатор вошедшего в аккаунт пользователя из переменной auth и использовать его, чтобы контролировать доступ пользователя к данным.

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

Чтобы выйти из аккаунта пользователя, вызовите функцию FirebaseAuth.signOut():

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();