Cómo migrar desde GoogleAuthUtil y Plus.API

Si integraste el Acceso con Google anteriormente usando GoogleAuthUtil.getToken o Plus.API, debes migrar a la API de Sign-In más reciente para obtener mayor seguridad y una mejor experiencia del usuario.

Migra desde un antipatrón de token de acceso

No debes enviar tokens de acceso obtenidos con GoogleAuthUtil.getToken a tu servidor de backend como una aserción de identidad, ya que no puedes verificar con facilidad que el token se emitió a tu backend y te hace vulnerable a la inserción de un token de acceso de un atacante.

Por ejemplo, si tu código de Android se parece al siguiente ejemplo, debes migrar tu app a las prácticas recomendadas actuales.

Código de Android

En el ejemplo, las solicitudes de token de acceso usan oauth2: más una string de permiso como parámetro scope para la llamada a GoogleAuthUtil.getToken (oauth2:https://www.googleapis.com/auth/plus.login).

En lugar de autenticarte con un token de acceso adquirido con GoogleAuthUtil.getToken, usa el flujo de token de ID o el flujo de código de Auth.

Migra al flujo del token de ID

Si todo lo que necesitas es el ID, la dirección de correo electrónico, el nombre o la URL de la foto de perfil del usuario, usa el flujo de token de ID.

Para migrar al flujo del token de ID, realiza los siguientes cambios:

Lado del cliente de Android

  • Quita el permiso GET_ACCOUNTS (Contactos) si lo solicitas
  • Cambia cualquier código que use GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() o AccountManager.newChooseAccountIntent() a Auth.GOOGLE_SIGN_IN_API con la configuración GoogleSignInOptions.Builder.requestIdToken(...).

En el servidor

Cómo migrar al flujo de código de Auth del servidor

Si tu servidor necesita acceder a otras APIs de Google, como Google Drive, YouTube o Contactos, usa el flujo de código de Auth del servidor.

Para migrar al flujo de código de Auth del servidor, realiza los siguientes cambios:

Lado del cliente de Android

  • Quita el permiso GET_ACCOUNTS (Contactos) si lo solicitas
  • Cambia cualquier código que use GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() o AccountManager.newChooseAccountIntent() a Auth.GOOGLE_SIGN_IN_API con la configuración GoogleSignInOptions.Builder.requestServerAuthCode(...).

En el servidor

Aún puedes compartir la lógica de acceso a la API entre tu extremo anterior y el nuevo. Por ejemplo:

GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(...);
String accessToken = tokenResponse.getAccessToken();
String refreshToken = tokenResponse.getRefreshToken();
Long expiresInSeconds = tokenResponse.getExpiresInSeconds();

// Shared by your old and new implementation, old endpoint can pass null for refreshToken
private void driveAccess(String refreshToken, String accessToken, Long expiresInSeconds) {
   GoogleCredential credential = new GoogleCredential.Builder()
           .setTransPort(...)
           ...
           .build();
   credential.setAccessToken(accessToken);
   credential.setExpiresInSeconds(expiresInSeconds);
   credential.setRefreshToken(refreshToken);
}

Cómo migrar desde el flujo de token de ID de GoogleAuthUtil

Si usas GoogleAuthUtil para obtener tokens de ID, debes migrar al nuevo flujo de token de ID de la API de Sign-In.

Por ejemplo, si tu código de Android se parece al siguiente ejemplo, debes realizar la migración:

Código de Android

En el ejemplo, las solicitudes de tokens de ID usan audience:server:client_id más el ID de cliente de tu servidor web como el parámetro “scope” para la llamada a GoogleAuthUtil.getToken (audience:server:client_id:9414861317621.apps.googleusercontent.com).

El nuevo flujo de token de ID de la API de Sign-In tiene los siguientes beneficios:

  • Experiencia optimizada de acceso con un toque
  • Tu servidor puede obtener información del perfil de usuario sin una llamada de red adicional

Para migrar al flujo del token de ID, realiza los siguientes cambios:

Lado del cliente de Android

  • Quita el permiso GET_ACCOUNTS (Contactos) si lo solicitas
  • Cambia cualquier código que use GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() o AccountManager.newChooseAccountIntent() a Auth.GOOGLE_SIGN_IN_API con la configuración GoogleSignInOptions.Builder.requestIdToken(...).

En el servidor

La nueva API de Sign-In emite tokens de ID que cumplen con la especificación de OpenID Connect, a diferencia de GoogleAuthUtil.getToken, que usa un formato obsoleto. En particular, la entidad emisora ahora es https://accounts.google.com, con un esquema https.

Durante el proceso de migración, tu servidor necesita verificar el token de ID de los clientes de Android anteriores y nuevos. Para verificar ambos formatos del token, realiza el cambio que corresponda a la biblioteca cliente que usas (si usas una):

  • Java (bibliotecas cliente de las APIs de Google): Actualiza a la versión 1.21.0 o posterior
  • PHP (bibliotecas cliente de las APIs de Google): si usas la versión 1, actualiza a la 1.1.6 o a una más reciente; si usas la versión 2, actualiza a la versión 2.0.0-RC1 o una más reciente.
  • Node.js: Actualiza a la versión 0.9.7 o posterior
  • Python o tus propias implementaciones: acepta ambas entidades emisoras: https://accounts.google.com y accounts.google.com

Cómo migrar desde el flujo de código de autenticación del servidor de GoogleAuthUtil

Si usas GoogleAuthUtil para obtener un código de Auth del servidor, debes migrar al flujo de código de Auth de la nueva API de Sign-In.

Por ejemplo, si tu código de Android se parece al siguiente ejemplo, debes realizar la migración:

Código de Android

En el ejemplo, las solicitudes de código de Auth del servidor usan oauth2:server:client_id + el ID de cliente de tu servidor web como el parámetro scope para la llamada a GoogleAuthUtil.getToken (oauth2:server:client_id:9414861317621.apps.googleusercontent.com).

El nuevo flujo de código de autorización de la API de Sign-In tiene los siguientes beneficios:

  • Experiencia optimizada de acceso con un toque
  • Si sigues la guía de migración que se indica a continuación, tu servidor podrá obtener un token de ID que contenga la información de perfil del usuario cuando realices el intercambio de código de Auth.

Para migrar al nuevo flujo de código Auth, realiza los siguientes cambios:

Lado del cliente de Android

  • Quita el permiso GET_ACCOUNTS (Contactos) si lo solicitas
  • Cambia cualquier código que use GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() o AccountManager.newChooseAccountIntent() a Auth.GOOGLE_SIGN_IN_API con la configuración GoogleSignInOptions.Builder.requestServerAuthCode(...).

En el servidor

Conserva tu código actual, pero especifica https://oauth2.googleapis.com/token como el extremo del servidor del token cuando construyas el objeto GoogleAuthorizationCodeTokenRequest para que puedas obtener un token de ID con el correo electrónico, el ID de usuario y la información de perfil del usuario sin necesidad de realizar otra llamada de red. Este extremo es totalmente retrocompatible y el siguiente código funcionará para los códigos de autenticación del servidor recuperados de las implementaciones de cliente de Android anteriores y nuevas.

GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(
                transport,
                jsonFactory,
                // Use below for tokenServerEncodedUrl parameter
                "https://oauth2.googleapis.com/token",
                clientSecrets.getDetails().getClientId(),
                clientSecrets.getDetails().getClientSecret(),
                authCode,
                REDIRECT_URI)
               .execute();

...

// You can also get an ID token from auth code exchange.
GoogleIdToken googleIdToken = tokenResponse.parseIdToken();
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
        .setAudience(Arrays.asList(SERVER_CLIENT_ID))
        .setIssuer("https://accounts.google.com")
        .build();
// Refer to ID token documentation to see how to get data from idToken object.
GoogleIdToken idToken = verifier.verify(idTokenString);
...