Autentica con los Servicios de juego de Google Play en Android

Puedes usar los Servicios de juego de Google Play para que los jugadores accedan a un juego de Android compilado con Firebase. Para usar el acceso de los Servicios de juego de Google Play con Firebase, haz que el jugador acceda a Google Play Juegos y, en ese momento, solicita un código de autorización OAuth 2.0. Después, pasa el código de Auth a PlayGamesAuthProvider para generar una credencial de Firebase que podrás usar para autenticar con este servicio.

Antes de comenzar

Configura tu proyecto de Android

  1. Si aún no lo has hecho, agrega Firebase al proyecto de Android.

  2. En el archivo de Gradle (generalmente <project>/<app-module>/build.gradle.kts o <project>/<app-module>/build.gradle) del módulo (a nivel de app), agrega la dependencia de la biblioteca de Android para Firebase Authentication. Te recomendamos usar la BoM de Firebase para Android para controlar las versiones de las bibliotecas.

    Además, como parte de la configuración de Firebase Authentication, debes agregar el SDK de Servicios de Google Play a la app.

    Kotlin+KTX

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:32.3.1"))
    
        // 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-ktx")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:20.7.0")
    }

    Si usas la BoM de Firebase para Android, tu app siempre utilizará versiones compatibles de las bibliotecas de Firebase para Android.

    (Alternativa) Agrega dependencias de la biblioteca de Firebase sin usar la BoM

    Si eliges no usar la BoM de Firebase, debes especificar cada versión de la biblioteca de Firebase en su línea de dependencia.

    Ten en cuenta que, si usas múltiples bibliotecas de Firebase en tu app, es muy recomendable que utilices la BoM para administrar las versiones de las bibliotecas para garantizar que todas las versiones sean compatibles.

    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-ktx:22.1.2")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:20.7.0")
    }

    Java

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:32.3.1"))
    
        // 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:20.7.0")
    }

    Si usas la BoM de Firebase para Android, tu app siempre utilizará versiones compatibles de las bibliotecas de Firebase para Android.

    (Alternativa) Agrega dependencias de la biblioteca de Firebase sin usar la BoM

    Si eliges no usar la BoM de Firebase, debes especificar cada versión de la biblioteca de Firebase en su línea de dependencia.

    Ten en cuenta que, si usas múltiples bibliotecas de Firebase en tu app, es muy recomendable que utilices la BoM para administrar las versiones de las bibliotecas a fin de garantizar que todas las versiones sean compatibles.

    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:22.1.2")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:20.7.0")
    }

Configura el proyecto de Firebase

  1. Configura la huella digital SHA-1 del juego desde la página Configuración de Firebase console.

    Para obtener el hash SHA de tu certificado de firma con el comando signingReport de Gradle, haz lo siguiente:

    ./gradlew signingReport

  2. Habilita Google Play Juegos como proveedor de acceso:

    1. Encuentra el secreto de cliente y el ID de cliente del servidor web del proyecto. El ID de cliente del servidor web identifica tu proyecto de Firebase en los servidores de autenticación de Google Play.

      Sigue estos pasos para encontrar esos valores:

      1. Abre el proyecto de Firebase en la página de credenciales de la Consola de API de Google.
      2. En la sección ID de cliente de OAuth 2.0, abre la página de detalles Cliente web (creado automáticamente por el servicio de Google). Esta página muestra el ID y el secreto de cliente del servidor web.
    2. Luego, en Firebase console, abre la sección Authentication.

    3. En la pestaña Método de acceso, habilita el proveedor de acceso Play Juegos. Deberás especificar el secreto de cliente y el ID de cliente del servidor web del proyecto, que obtuviste de la Consola de API.

Configura los Servicios de juego de Play con la información de tu app de Firebase

  1. En Google Play Console, abre tu app de Google Play o crea una.

  2. En la sección Crecimiento, haz clic en Servicios de juego de Play > Configuración y administración > Configuración.

  3. Haz clic en Sí, mi juego ya usa las APIs de Google, selecciona tu proyecto de Firebase de la lista y, luego, haz clic en Usar.

  4. En la página de configuración de los Servicios de juego de Play, haz clic en Agregar credencial.

    1. Selecciona el tipo Servidor de juegos.
    2. En el campo Cliente de OAuth, selecciona el ID de cliente web de tu proyecto. Asegúrate de que sea el mismo ID de cliente que especificaste cuando habilitaste el acceso con Play Juegos.
    3. Guarda los cambios.
  5. En la página de configuración de los Servicios de juego de Play, vuelve a hacer clic en Agregar credencial.

    1. Selecciona el tipo Android.
    2. En el campo Cliente de OAuth, selecciona el ID de cliente de Android de tu proyecto. Si no ves tu ID de cliente de Android, asegúrate de establecer la huella digital SHA-1 de tu juego en Firebase console.
    3. Guarda los cambios.
  6. En la página Verificadores, incluye las direcciones de correo electrónico de los usuarios que deben poder acceder a tu juego antes de que lo lances en Play Store.

Integra el acceso a Play Juegos en tu juego

Primero, integra el acceso de Play Juegos en tu app. Consulta el artículo de acceso a juegos de Android para obtener instrucciones detalladas.

En tu integración, cuando compiles el objeto GoogleSignInOptions, usa la configuración DEFAULT_GAMES_SIGN_IN y llama a requestServerAuthCode:

Kotlin+KTX

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();

Debes pasar tu ID de cliente del servidor web al método requestServerAuthCode. Este es el ID que proporcionaste cuando habilitaste el acceso a Play Juegos en Firebase console.

Autentica con Firebase

Después de agregar el acceso a Play Juegos en tu app, debes configurar Firebase para usar las credenciales de la Cuenta de Google que obtienes cuando un jugador accede correctamente con Play Juegos.

  1. Primero, en el método onCreate de tu actividad de acceso, obtén la instancia compartida del objeto FirebaseAuth:

Kotlin+KTX

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

Java

private FirebaseAuth mAuth;
// ...
// Initialize Firebase Auth
mAuth = FirebaseAuth.getInstance();
  1. Cuando inicialices tu actividad, confirma si el jugador ya accedió con Firebase:

Kotlin+KTX

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);
}
If the player isn't signed in, present the player with your game's
signed-out experience, including the option to sign in.
  1. Una vez que un jugador acceda con Play Juegos, ya sea de manera silenciosa o interactiva, obtén el código de Auth a partir del objeto GoogleSignInAccount, intercámbialo por una credencial de Firebase y usa esa credencial para autenticar con Firebase:

Kotlin+KTX

// 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);
                    }

                    // ...
                }
            });
}

Si la llamada a signInWithCredential funciona correctamente, puedes usar el método getCurrentUser para obtener los datos de la cuenta del usuario.

Próximos pasos

Cuando un usuario accede por primera vez, se crea una nueva cuenta de usuario que se vincula a su ID de Play Juegos. Esta cuenta nueva se almacena como parte de tu proyecto de Firebase y se puede usar para identificar a un usuario en todas las apps del proyecto.

En tu juego, puedes obtener el UID de Firebase del usuario desde el objeto FirebaseUser, como en los siguientes ejemplos:

Kotlin+KTX

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();

En tus reglas de seguridad de Firebase Realtime Database y Cloud Storage, puedes obtener el ID del usuario único que accedió a partir de la variable auth y usarlo para controlar a qué datos podrá acceder.

Si quieres obtener la información de jugador de Play Juegos de un usuario o acceder a los Servicios de Play Juegos, usa las API que proporcionó el SDK de Google Play Juegos.

Para salir de la sesión de un usuario, llama a FirebaseAuth.signOut():

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();