Migrar desde GoogleAuthUtil y Plus.API

Si se integró con Google Sign-In en el pasado utilizando GoogleAuthUtil.getToken o Plus.API , debe migrar a la API de Plus.API sesión más reciente para una mayor seguridad y una mejor experiencia de usuario.

Migrar desde el antipatrón del token de acceso

No debe enviar tokens de acceso obtenidos con GoogleAuthUtil.getToken a su servidor backend como una afirmación de identidad, ya que no puede verificar fácilmente que el token se emitió a su backend, dejándolo vulnerable a la inserción de un token de acceso de un atacante.

Por ejemplo, si su código de Android se parece al ejemplo siguiente, debe migrar su aplicación a las mejores prácticas actuales.

Código de Android

En el ejemplo, el acceso solicitudes de token utilizan oauth2: además de una cadena de alcance que el scope de parámetros para el GoogleAuthUtil.getToken llamada ( oauth2:https://www.googleapis.com/auth/plus.login ).

En lugar de autenticarse con un token de acceso adquirido con GoogleAuthUtil.getToken , use el flujo de token de ID o el flujo de código de autenticación.

Migrar al flujo del token de ID

Si todo lo que necesita es la identificación del usuario, la dirección de correo electrónico, el nombre o la URL de la imagen de perfil, utilice el flujo de token de identificación .

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

Lado del cliente de Android

  • Elimine el GET_ACCOUNTS (Contactos) si lo solicita
  • Cambie cualquier código usando GoogleAuthUtil , Plus.API , AccountPicker.newChooseAccountIntent() o AccountManager.newChooseAccountIntent() a Auth.GOOGLE_SIGN_IN_API con la GoogleSignInOptions.Builder.requestIdToken(...) .

Lado del servidor

Migrar al flujo del código de autenticación del servidor

Si su servidor necesita acceder a otras API de Google, como Google Drive, Youtube o Contactos, use el flujo de código de autenticación del servidor .

Para migrar al flujo de código de autenticación del servidor, realice los siguientes cambios:

Lado del cliente de Android

  • Elimine el GET_ACCOUNTS (Contactos) si lo solicita
  • Cambie cualquier código usando GoogleAuthUtil , Plus.API , AccountPicker.newChooseAccountIntent() o AccountManager.newChooseAccountIntent() a Auth.GOOGLE_SIGN_IN_API con la GoogleSignInOptions.Builder.requestServerAuthCode(...) .

Lado del servidor

Aún puede compartir la lógica de acceso a la API entre sus puntos finales antiguos y nuevos. 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);
}

Migrar desde el flujo de token de ID de GoogleAuthUtil

Si usa GoogleAuthUtil para obtener tokens de ID, debe migrar al nuevo flujo de tokens de ID de API de GoogleAuthUtil de sesión.

Por ejemplo, si su código de Android se parece al siguiente ejemplo, debe migrar:

Código de Android

En el ejemplo, las solicitudes de token de ID usan audience:server:client_id más la ID de cliente para su servidor web como el parámetro 'alcance' para la llamada GoogleAuthUtil.getToken ( audience:server:client_id:9414861317621.apps.googleusercontent.com ).

El nuevo flujo de token de ID de API de inicio de sesión tiene las siguientes ventajas:

  • Experiencia de inicio de sesión optimizada con un solo toque
  • Su servidor puede obtener información de perfil de usuario sin una llamada de red adicional

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

Lado del cliente de Android

  • Elimine el GET_ACCOUNTS (Contactos) si lo solicita
  • Cambie cualquier código usando GoogleAuthUtil , Plus.API , AccountPicker.newChooseAccountIntent() o AccountManager.newChooseAccountIntent() a Auth.GOOGLE_SIGN_IN_API con la GoogleSignInOptions.Builder.requestIdToken(...) .

Lado del servidor

La nueva API de GoogleAuthUtil.getToken sesión emite tokens de identificación que cumplen con la especificación OpenID Connect, a diferencia de GoogleAuthUtil.getToken , que utiliza un formato obsoleto. En particular, el emisor ahora es https://accounts.google.com , con un esquema https .

Durante su proceso de migración, su servidor debe verificar el token de identificación de sus clientes Android nuevos y antiguos. Para verificar ambos formatos del token, realice el cambio que corresponda a la biblioteca cliente que usa (si usa una):

  • Java (bibliotecas cliente de las API de Google): actualice a 1.21.0 o más reciente
  • PHP (bibliotecas cliente de las API de Google): si usa v1, actualice a 1.1.6 o más reciente; si usa v2, actualice a 2.0.0-RC1 o más reciente
  • Node.js: actualice a 0.9.7 o más reciente
  • Python o sus propias implementaciones: acepte estos dos emisores: https://accounts.google.com y accounts.google.com

Migrar desde el flujo de código de autenticación del servidor GoogleAuthUtil

Si usa GoogleAuthUtil para obtener un código de autenticación del servidor, debe migrar al nuevo flujo de código de autenticación de la API de inicio de sesión.

Por ejemplo, si su código de Android se parece al siguiente ejemplo, debe migrar:

Código de Android

En el ejemplo, las solicitudes de autenticación del servidor de código utilizan oauth2:server:client_id + el ID de cliente para el servidor web como el scope de parámetros para el GoogleAuthUtil.getToken llamada ( oauth2:server:client_id:9414861317621.apps.googleusercontent.com ).

El nuevo flujo de código de autenticación de la API de inicio de sesión tiene las siguientes ventajas:

  • Experiencia de inicio de sesión optimizada con un solo toque
  • Si sigue la guía de migración a continuación, su servidor puede obtener un token de identificación que contiene la información del perfil del usuario cuando realiza el intercambio de código de autenticación.

Para migrar al nuevo flujo de código de autenticación, realice los siguientes cambios:

Lado del cliente de Android

  • Elimine el GET_ACCOUNTS (Contactos) si lo solicita
  • Cambie cualquier código usando GoogleAuthUtil , Plus.API , AccountPicker.newChooseAccountIntent() o AccountManager.newChooseAccountIntent() a Auth.GOOGLE_SIGN_IN_API con la GoogleSignInOptions.Builder.requestServerAuthCode(...) .

Lado del servidor

Conserve su código actual, pero especifique https://oauth2.googleapis.com/token como el punto final del servidor de tokens al construir el objeto GoogleAuthorizationCodeTokenRequest , para que pueda obtener un token de identificación con el correo electrónico del usuario, la identificación de usuario y la información de perfil sin el necesidad de otra llamada de red. Este punto final es totalmente compatible con versiones anteriores, y el siguiente código funcionará para los códigos de autenticación del servidor recuperados de sus implementaciones de cliente Android antiguas 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);
...