Autenticar usando los servicios de juegos de Google Play en Android

Puedes utilizar los servicios de Google Play Games para iniciar sesión en un juego de Android creado en Firebase. Para utilizar los servicios de Google Play Games, inicie sesión con Firebase, primero inicie sesión en el jugador con Google Play Games y solicite un código de autenticación OAuth 2.0 cuando lo haga. Luego, pase el código de autenticación a PlayGamesAuthProvider para generar una credencial de Firebase, que puede usar para autenticarse con Firebase.

Antes de que empieces

Configura tu proyecto de Android

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

  2. En el archivo Gradle de su módulo (nivel de aplicación) (generalmente <project>/<app-module>/build.gradle.kts o <project>/<app-module>/build.gradle ), agregue la dependencia para la autenticación de Firebase. biblioteca para Android. Recomendamos utilizar Firebase Android BoM para controlar el control de versiones de la biblioteca.

    Además, como parte de la configuración de la autenticación de Firebase, debes agregar el SDK de servicios de Google Play a tu aplicación.

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

    Al usar Firebase Android BoM , su aplicación siempre usará versiones compatibles de las bibliotecas de Firebase Android.

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

    Si elige no utilizar la BoM de Firebase, debe especificar cada versión de la biblioteca de Firebase en su línea de dependencia.

    Tenga en cuenta que si usa varias bibliotecas de Firebase en su aplicación, le recomendamos encarecidamente usar la BoM para administrar las versiones de la biblioteca, lo que garantiza 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.3.1")
    // Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:21.0.0")
    }
    ¿Busca un módulo de biblioteca específico de Kotlin? A partir de octubre de 2023 (Firebase BoM 32.5.0) , tanto los desarrolladores de Kotlin como los de Java podrán depender del módulo de biblioteca principal (para más detalles, consulte las preguntas frecuentes sobre esta iniciativa ).

Configura tu proyecto de Firebase

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

    Puede obtener el hash SHA de su certificado de firma con el comando Gradle signingReport :

    ./gradlew signingReport

  2. Habilite Google Play Games como proveedor de inicio de sesión:

    1. Encuentre el ID de cliente del servidor web y el secreto de cliente de su proyecto. El ID del cliente del servidor web identifica su proyecto de Firebase ante los servidores de autenticación de Google Play.

      Para encontrar estos valores:

      1. Abra su proyecto de Firebase en la página de credenciales de la consola de las API de Google .
      2. En la sección ID de cliente de OAuth 2.0 , abra la página de detalles del cliente web (creado automáticamente por el servicio de Google) . Esta página enumera el ID y el secreto del cliente de su servidor web.
    2. Luego, en Firebase console , abre la sección Autenticación .

    3. En la pestaña Método de inicio de sesión , habilite el proveedor de inicio de sesión de Play Games . Deberá especificar el ID de cliente del servidor web y el secreto de cliente de su proyecto, que obtuvo de la consola de API.

Configura los servicios de Play Games con la información de tu aplicación Firebase

  1. En Google Play Console , abre tu aplicación Google Play o crea una.

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

  3. Haz clic en Sí, mi juego ya usa las API 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 servicios de Play Games, haga clic en Agregar credencial .

    1. Seleccione el tipo de servidor de juegos .
    2. En el campo Cliente OAuth , seleccione el ID del cliente web de su proyecto. Asegúrate de que sea el mismo ID de cliente que especificaste cuando habilitaste el inicio de sesión en Play Games.
    3. Guarde sus cambios.
  5. Aún en la página de configuración de servicios de Play Games, haga clic en Agregar credencial nuevamente.

    1. Seleccione el tipo de Android .
    2. En el campo Cliente OAuth , seleccione el ID del cliente Android de su proyecto. (Si no ves tu ID de cliente de Android, asegúrate de configurar la huella digital SHA-1 de tu juego en la consola Firebase).
    3. Guarde sus cambios.
  6. En la página Probadores , agrega las direcciones de correo electrónico de cualquier usuario que necesite poder iniciar sesión en tu juego antes de lanzarlo en Play Store.

Integra el inicio de sesión de Play Games en tu juego

Primero, integra el inicio de sesión de Play Games en tu aplicación. Consulta Iniciar sesión en juegos de Android para obtener instrucciones completas.

En su integración, cuando cree el objeto GoogleSignInOptions , use la configuración DEFAULT_GAMES_SIGN_IN y llame 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();

Debe pasar el ID de cliente de su servidor web al método requestServerAuthCode . Esta es la identificación que proporcionaste cuando habilitaste el inicio de sesión de Play Games en Firebase console.

Autenticar con Firebase

Después de agregar el inicio de sesión de Play Games a tu aplicación, debes configurar Firebase para usar las credenciales de la cuenta de Google que obtienes cuando un jugador inicia sesión correctamente con Play Games.

  1. Primero, en el método onCreate de tu actividad de inicio de sesión, 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. Al inicializar su Actividad, verifique si el jugador ya inició sesión 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. Después de que un jugador inicie sesión en Play Games, ya sea de forma silenciosa o interactiva, obtenga el código de autenticación del objeto GoogleSignInAccount , cámbielo por una credencial de Firebase y autentíquese con Firebase usando la credencial de 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 tiene éxito, puede utilizar el método getCurrentUser para obtener los datos de la cuenta del usuario.

Próximos pasos

Después de que un usuario inicia sesión por primera vez, se crea una nueva cuenta de usuario y se vincula a su ID de Play Games. Esta nueva cuenta se almacena como parte de su proyecto de Firebase y se puede usar para identificar a un usuario en cada aplicación de su proyecto.

En tu juego, puedes obtener el UID de Firebase del usuario desde el objeto FirebaseUser :

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 las reglas de seguridad de Firebase Realtime Database y Cloud Storage, puede obtener el ID de usuario único del usuario que inició sesión a partir de la variable auth y usarlo para controlar a qué datos puede acceder un usuario.

Para obtener la información del jugador de Play Games de un usuario o acceder a los servicios de Play Games, utilice las API proporcionadas por el SDK de Google Play Games .

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

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();