Si ya realizaste la integración con el Acceso con Google usando GoogleAuthUtil.getToken
o Plus.API
, deberás migrar a la API de Acceso más reciente para obtener una mayor seguridad y una mejor experiencia del usuario.
Cómo migrar desde el 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 fácilmente
que el token se haya emitido a tu backend, lo que te deja vulnerable a la inserción
de un token de acceso de un atacante.
Por ejemplo, si tu código de Android se ve como el siguiente ejemplo, debes migrar tu app a las prácticas recomendadas actuales.
En el ejemplo, las solicitudes de token de acceso usan oauth2:
más una cadena de permiso como el parámetro scope
para la llamada GoogleAuthUtil.getToken
(oauth2:https://www.googleapis.com/auth/plus.login
).
En lugar de autenticar con un token de acceso adquirido con GoogleAuthUtil.getToken
, usa el flujo de token de ID o el flujo de código de autenticación.
Cómo migrar al flujo de token de ID
Si todo lo que necesitas es el ID del usuario, la dirección de correo electrónico, el nombre o la URL de la foto de perfil, usa el flujo de token de ID.
Para migrar al flujo de tokens de ID, realiza los siguientes cambios:
Del cliente de Android
- Quita el permiso
GET_ACCOUNTS
(Contactos) si lo solicitas - Cambia cualquier código que use
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
oAccountManager.newChooseAccountIntent()
aAuth.GOOGLE_SIGN_IN_API
con la configuración deGoogleSignInOptions.Builder.requestIdToken(...)
.
En el servidor
- Crea un extremo nuevo para la autenticación de tokens de ID.
- Desactiva el extremo anterior después de que se migren tus apps cliente
Migra al flujo de código de autorización del servidor
Si el servidor necesita acceder a otras APIs de Google, como Google Drive, YouTube o Contactos, usa el flujo de código de autenticación del servidor.
Para migrar al flujo de código de autorización del servidor, realiza los siguientes cambios:
Del cliente de Android
- Quita el permiso
GET_ACCOUNTS
(Contactos) si lo solicitas - Cambia cualquier código que use
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
oAccountManager.newChooseAccountIntent()
aAuth.GOOGLE_SIGN_IN_API
con la configuración deGoogleSignInOptions.Builder.requestServerAuthCode(...)
.
En el servidor
- Crea un extremo nuevo para el flujo de código de autenticación del servidor.
- Cómo desactivar el extremo anterior después de migrar tus apps cliente
Puedes compartir la lógica de acceso a la API entre tus extremos 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); }
Migra desde el flujo de tokens de ID de GoogleAuthUtil
Si usas GoogleAuthUtil
para obtener tokens de ID, debes migrar al nuevo flujo de tokens de ID de la API de acceso.
Por ejemplo, si tu código de Android se ve como el siguiente ejemplo, debes realizar la migración:
En el ejemplo, las solicitudes de token 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 GoogleAuthUtil.getToken
(audience:server:client_id:9414861317621.apps.googleusercontent.com
).
El nuevo flujo de tokens de ID de la API de Sign-In tiene los siguientes beneficios:
- Experiencia de acceso optimizada con un solo toque
- Tu servidor puede obtener información del perfil del usuario sin una llamada de red adicional.
Para migrar al flujo de tokens de ID, realiza los siguientes cambios:
Del cliente de Android
- Quita el permiso
GET_ACCOUNTS
(Contactos) si lo solicitas - Cambia cualquier código que use
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
oAccountManager.newChooseAccountIntent()
aAuth.GOOGLE_SIGN_IN_API
con la configuración deGoogleSignInOptions.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, el emisor ahora es https://accounts.google.com
, con un esquema https
.
Durante el proceso de migración, el servidor debe verificar el token de ID de los clientes de Android antiguos 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 una posterior
- PHP (bibliotecas cliente de las APIs de Google): Si usas la versión 1, actualízala a la 1.1.6 o una posterior. Si usas la versión 2, actualízala a la 2.0.0-RC1 o una posterior.
- Node.js: Actualiza a 0.9.7 o a una versión más reciente.
- Python o tus propias implementaciones: Aceptan ambos emisores:
https://accounts.google.com
yaccounts.google.com
.
Migra desde el flujo de código de autorización del servidor GoogleAuthUtil
Si usas GoogleAuthUtil
para obtener un código de autorización del servidor, debes migrar al nuevo flujo de código de autorización de la API de Sign-In.
Por ejemplo, si tu código de Android se ve como el siguiente ejemplo, debes realizar la migración:
En el ejemplo, las solicitudes de código de autenticación del servidor usan oauth2:server:client_id
+ el ID de cliente de tu servidor web como el parámetro scope
para la llamada 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 de acceso optimizada con un solo toque
- Si sigues la guía de migración que se indica a continuación, tu servidor puede obtener un token de ID que contiene la información del perfil del usuario cuando realizas el intercambio de códigos de autenticación.
Para migrar al nuevo flujo de código de Auth, realiza los siguientes cambios:
Del 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()
oAccountManager.newChooseAccountIntent()
aAuth.GOOGLE_SIGN_IN_API
con la configuración deGoogleSignInOptions.Builder.requestServerAuthCode(...)
.
En el servidor
Conserva tu código actual, pero especifica https://oauth2.googleapis.com/token
como el extremo del servidor de tokens cuando construyas el objeto GoogleAuthorizationCodeTokenRequest
para que puedas obtener un token de ID con el correo electrónico, el ID y la información del 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 clientes de 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); ...