Autentica en Unity con los Servicios de juego de Google Play

Puedes usar los Servicios de juego de Google Play para controlar el acceso de usuarios a un juego de Android compilado en Firebase y Unity. Para usar el acceso de los Servicios de juego de Google Play con Firebase, haz que el jugador acceda a Google Play Juegos y solicita un código de autorización OAuth 2.0 durante el proceso. Después, pasa este código a PlayGamesAuthProvider para generar una credencial de Firebase que podrás usar para autenticar con la plataforma.

Antes de comenzar

Configura tu proyecto de Unity

  1. Agrega el archivo de configuración de Firebase y el SDK de Firebase Unity a tu proyecto de Unity como se describe en Agrega Firebase a tu proyecto de Unity. Sigue las instrucciones para Android.

    Asegúrate de importar FirebaseAuth.unitypackage.

  2. En Unity Editor, ve a Build Settings > Player Settings > Other Settings y configura el nombre del paquete de Android de tu juego.

  3. Luego, ve a Build Settings > Player Settings > Publishing Settings y selecciona o crea un almacén de claves y una clave, que se usarán para firmar tu paquete de Android. Tu APK debe estar firmado para que el acceso mediante Play Juegos funcione. Este requisito no solo se aplica a las publicaciones, sino también al desarrollo del juego.

Configura el proyecto de Firebase

  1. En Firebase console, ve al proyecto de Firebase en el que registraste tu proyecto de Unity.

  2. Configura la huella digital SHA-1 de tu juego desde la página Configuración de Firebase console, con la clave que configuraste en Unity.

    Puedes obtener la huella digital SHA-1 de tu clave con el comando keytool:

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

    De forma alternativa, puedes obtener el hash SHA de tu certificado de firma con el comando signingReport de Gradle de la siguiente manera:

    gradlew signingReport

    El APK debe estar firmado con esta clave, incluso durante el desarrollo.

  3. Habilita Google Play Juegos como proveedor de acceso:

    1. En Firebase console, abre la sección Authentication.

    2. Genera y obtén el secreto de cliente y el ID de cliente del servidor web de tu proyecto:

      1. En la pestaña Sign in method, habilita el proveedor de acceso de Google.

      2. Copia el ID y el secreto de cliente del servidor web del proveedor de acceso de Google.

    3. En la pestaña Sign in method, habilita el proveedor de acceso de Play Juegos y especifica el ID y el secreto de cliente del servidor web de tu proyecto, que obtuviste en el paso anterior.

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 las páginas Eventos, Logros y Tablas de clasificación, crea cualquier recurso de Play Juegos que quieras usar con tu juego. Si no quieres usar ninguno de inmediato, puedes crear una entrada de marcador de posición. Luego, haz clic en Obtener recursos en cualquiera de las páginas Eventos, Logros o Tablas de clasificación, y copia el fragmento de los recursos de Android en el lugar que prefieras. Necesitarás este fragmento para configurar el complemento de los Servicios de juego de Google Play.

    El fragmento de recursos luce como el siguiente ejemplo:

    <?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. En la página Verificadores, incluye las direcciones de correo electrónico de los usuarios que deben poder acceder a tu juego antes de su lanzamiento en Play Store.

Integra el acceso con Play Juegos en tu juego

  1. Descarga la versión más reciente del complemento de Play Juegos para Unity y extráela.

  2. Importa el paquete de Unity más reciente del complemento a tu proyecto de Unity. Para encontrar el paquete, consulta el directorio current-build del archivo de la versión.

  3. Configura el complemento de Play Juegos:

    1. Haz clic en Ventana > Google Play Juegos > Configuración > Configuración de Android para abrir la pantalla Configuración de Android.
    2. Pega el fragmento de recursos de Android que obtuviste de Play Console en el campo Definición de recursos.
    3. Pega el ID de cliente del servidor web (que proporcionaste cuando habilitaste el acceso de Play Juegos en Firebase console) en el campo ID de cliente.
    4. Haz clic en Configuración.
  4. En tu juego, configura un cliente de Play Juegos con la configuración RequestServerAuthCode habilitada:

    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. Luego, cuando un jugador seleccione acceder con Play Juegos, llama a Social.localUser.Authenticate():

    Social.localUser.Authenticate((bool success) => {
      // handle success or failure
    });
    

Autentica con Firebase

Después de que integres el acceso a tu juego con Play Juegos, puedes usar el código de Auth de los Servicios de juego de Play para realizar la autenticación en Firebase.

  1. Después de que el jugador acceda correctamente mediante Play Juegos, en el controlador de continuación de acceso, obtén un código de Auth para la cuenta del jugador:

    Social.localUser.Authenticate((bool success) => {
      if (success) {
        authCode = PlayGamesPlatform.Instance.GetServerAuthCode();
      }
    });
    
  2. Luego, intercambia el código de Auth desde los Servicios de juego de Play para obtener una credencial de Firebase. Luego, usa esa credencial para autenticar al jugador de la siguiente manera:

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

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 puede usarse 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 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;
}

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.

Para obtener la información de jugador de un usuario de Play Juegos o acceder a los Servicios de juego de Play, usa las APIs que proporcionó el complemento de Play Juegos.

Para salir de la sesión de un usuario, llama a SignOut():

auth.SignOut();