A través de la transferencia de las API de Games a un nuevo modelo, estamos tomando medidas para reducir la fricción en el inicio de sesión y las solicitudes innecesarias de permisos para los jugadores. En la nueva interacción se contempla lo siguiente:
- Los jugadores deberán iniciar sesión una vez por cuenta y no una vez por juego.
- Los jugadores ya no deberán actualizar su cuenta a Google+ para usar servicios de Google Play Games.
- Una vez que los jugadores inicien sesión por primera vez, no deberán hacerlo en futuros juegos. El procedimiento será automático.
- Nota: los jugadores pueden desactivar el inicio de sesión automático a través de la configuración de la aplicación de Google Play Games.
- Una vez que un usuario inicie sesión por primera vez, el inicio de sesión generalmente será posible en los juegos nuevos sin su intervención.
- No hay pantallas de consentimiento para el inicio de sesión en ningún juego. El inicio de sesión será automático para cada juego nuevo.
Para respetar la privacidad del usuario y evitar revelar su nombre real, también se debe cambiar la manera en que funcionan los Id. de jugador.
- En el caso de los jugadores existentes: cuando estos inicien sesión, los juegos continuarán obteniendo su Id. de Google+ (también llamada “Id. de jugador” en la documentación anterior).
- En el caso de los jugadores nuevos: los juegos obtendrán un Id. de jugador nuevo diferente de los que se usaron anteriormente.
Posibles problemas
En la mayoría de los juegos no deberían producirse interrupciones ni cambios en el servicio. Sin embargo, existen muchísimos casos en los que se necesitan ciertos cambios.
A continuación, se muestran algunos problemas y las posibles soluciones. Ejemplos:
- Solicitud innecesaria del ámbito de Google+.
- Problema: tus usuarios verán ventanas de consentimiento innecesarias y potencialmente molestas.
- Solución: no solicites ámbitos adicionales a menos que los necesites imperiosamente.
- Uso del Id. de jugador de Google Play Games para otras API de Google que no sean juegos.
- Problema: no obtendrás datos válidos de estos otros puntos finales.
- Solución: no uses el Id. de jugador para otras API de Google.
- Uso de token de acceso móvil o de clientes en el servidor.
- Problema: es posible que tu token de acceso no contenga la información que buscas.
- Esto, de hecho, no se recomienda.
- Solución: usa la nueva API GetServerAuthCode como alternativa.
Tratemos cada uno de estos problemas en detalle.
Problema: solicitud de ámbitos innecesarios
En las primeras versiones de nuestros ejemplos y documentos se creó un GoogleApiClient de la siguiente manera:
// Don’t do it this way!
GoogleApiClient gac = new GoogleApiClient.Builder(this, this, this)
.addApi(Games.API)
.addScope(Plus.SCOPE_PLUS_LOGIN) // The bad part
.build();
// Don’t do it this way!
En este caso, el desarrollador solicita específicamente el ámbito
plus.login. Si
solicitas plus.login,
tus usuarios verán un cuadro de diálogo de consentimiento.
Solución: solicita únicamente los ámbitos que necesites
Elimina los ámbitos innecesarios de tu construcción de GoogleApiClient junto con las API que ya no uses.
// This way you won’t get a consent screen
GoogleApiClient gac = new GoogleApiClient.Builder(this, this, this)
.addApi(Games.API)
.build();
// This way you won’t get a consent screen
Para usuarios de Google+
Si en tu aplicación se usan funciones de Google+, como la solicitud de acceso al gráfico social real de Google+ del jugador, ten en cuenta que de todas formas los usuarios nuevos deberán contar con un perfil de Google+ para usar tu juego. Ten en cuenta que los usuarios existentes que hayan iniciado sesión no deberán dar nuevamente su consentimiento.
Si deseas solicitar cuentas de Google+ para usar tu juego, cambia la declaración de Games.API de modo que se vea así:
.addApi(Games.API, new GamesOptions.Builder()
.setRequireGooglePlus(true).build())
Esto garantizará que tu juego siga solicitando los permisos y ámbitos necesarios para continuar usando el gráfico social y el perfil de nombre reales del jugador.
Problema: uso del Id. de jugador como un Id. diferente
Si llamas a la API Games.getCurrentPlayerId(), el valor devuelto aquí será el identificador que Google Play Games use para el jugador en cuestión.
Tradicionalmente, este valor podía pasarse a otras API, como Plus.PeopleApi.load. En el nuevo modelo, esto ya no sucede.
Los Id. de jugador SOLO son válidos para usarse con API de Google Play Games.
Solución: no combines Id.
Las API de Google Play Games (a las que se accede desde com.google.android.gms.games) usan el Id. de jugador. Mientras solo hagas uso de ellas, funcionarán con los Id. nuevos.
Problema: uso de token de acceso móvil o de clientes en el servidor
Un patrón común observado:
- Usar GoogleAuthUtil para obtener un token de acceso.
- Enviar este token a un servidor.
- En el servidor, llamar a Google para verificar la autenticidad. La manera más común de hacer esto es llamar ahttps://www.googleapis.com/oauth2/v1/tokeninfo y ver la respuesta.
Esto, en primer lugar, no se recomienda e incluso debe evitarse aún más después del cambio de ámbitos.
Los motivos:
- Exige que tu aplicación reconozca la cuenta que el usuario está usando, para lo cual debe conservarse el permiso GET_ACCOUNTS. En Android M, esto hará que se solicite al usuario compartir sus contactos con tu aplicación en el tiempo de ejecución, una acción que puede resultar intimidatoria.
- El punto final de tokeninfo en realidad no está diseñado para este caso de uso; está diseñado para funcionar principalmente como herramienta de depuración, no como API de producción. Esto significa que, en el futuro, puedes estar sujeto a límites según la cantidad si llamas a esta API.
- Es posible que el user_id devuelto por la información sobre el token no esté presente en el modelo nuevo. Incluso si lo está, el valor no equivaldrá al Id. de jugador nuevo. (Consulta el problema 2, arriba).
- El token podría caducar en cualquier momento (la precisión de los plazos de caducidad de los token de acceso no es absoluta).
- Para el uso de token de clientes en el servidor se necesitan verificaciones de validación adicionales, a fin de garantizar que no se otorguen token a aplicaciones diferentes.
Solución: usa el flujo de código de la nueva API GetServerAuthCode
Afortunadamente, la solución es conocida y básicamente equivale a nuestras
recomendaciones de autenticación del lado del servidor para la Web.
Realiza una actualización a la última versión del SDK de Google Play Services (por lo menos la 8.4.87).
Crea un Id. de cliente de servidor si no cuentas ya con uno.
Dirígete a la Consola para desarrolladores de Google y selecciona tu proyecto.
Desde la barra de navegación izquierda, selecciona “API Manager” y luego “Credentials”.
Elige “New Credentials” y luego “OAuth Client ID”.
Selecciona “Web Application” y asigna un nombre útil para tu aplicación.
El Id. de cliente para esta aplicación web ahora será tu Id. de cliente del servidor.
En tu juego, conéctate a tu GoogleApiClient de la manera habitual.
Una vez conectado, llama a la siguiente API:
Games.getGamesServerAuthCode(googleApiClient, “tu_Id._de_cliente_del_servidor”)
Si usaste GoogleAuthUtil antes, probablemente la hayas llamado en un subproceso en segundo plano. En ese caso, el código tendrá el siguiente aspecto:
// Good way
{
GetServerAuthCodeResult result =
Games.getGamesServerAuthCode(gac, clientId).await();
if (result.isSuccess()) {
String authCode = result.getCode();
// Send code to server.
}
}
// Good way
Envía el código de autenticación a tu servidor, exactamente como lo hiciste antes.
-
Deberás proporcionar el Id. de cliente del servidor, el secreto de cliente del servidor (mencionado en la Consola para desarrolladores cuando creaste el Id. de cliente del servidor) y el código de autenticación.
-
-
Una vez que tengas acceso al token, podrás llamar a www.googleapis.com/games/v1/applications/<app_id>/verify/ usando un token de acceso.
Pasa el token de autorización en un encabezado, de la siguiente manera:
“Authorization: OAuth <access_token>”
El valor de respuesta contendrá el Id. de jugador del usuario. Este es el Id. de jugador correcto que debe usarse para el jugador en cuestión.
Este token de acceso puede usarse para realizar llamadas adicionales de servidor a servidor según sea necesario.
Nota: esta API solo devolverá el valor “200” si el token de acceso se emitió para tu aplicación web.
Resumen
Para aclarar bien lo expresado: si no realizas modificaciones, a menos que dependas exclusivamente de funciones de Google+, no observarás cambios en la funcionalidad y la experiencia de inicio de sesión será más fluida si:
- solicitas ámbitos de Google+ sin usarlos, te convendrá dejar de usarlos en adelante;
- envías token de acceso de clientes a tu servidor, te sugerimos profundamente usargetGamesServerAuthCode() como alternativa.
¡Gracias! Sigue creando juegos fabulosos.