Si integraste el Acceso con Google en el pasado usando
GoogleAuthUtil.getToken
o Plus.API
, deberías migrar a la más reciente
API de Acceso para 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
que el token se emitió a tu backend, lo que te deja vulnerable a
de un token de acceso de un atacante.
Por ejemplo, si tu código de Android se parece al siguiente ejemplo, deberías migrar tu app a las prácticas recomendadas actuales.
En el ejemplo, las solicitudes de token de acceso usan oauth2:
junto con una cadena de alcance como el
Parámetro scope
para la llamada GoogleAuthUtil.getToken
(oauth2:https://www.googleapis.com/auth/plus.login
).
En lugar de autenticarse con un token de acceso adquirido con
GoogleAuthUtil.getToken
: Usa el flujo de token de ID o el flujo de código de Auth.
Cómo migrar al flujo de token de ID
Si solo necesitas el ID, la dirección de correo electrónico, el nombre o la URL de la foto de perfil del usuario utiliza el flujo de token de ID.
Para migrar al flujo de token de ID, realiza los siguientes cambios:
Del lado del cliente de Android
- Quita el permiso
GET_ACCOUNTS
(Contactos) si lo solicitas. - Cambia cualquier código mediante
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
oAccountManager.newChooseAccountIntent()
aAuth.GOOGLE_SIGN_IN_API
con Configuración deGoogleSignInOptions.Builder.requestIdToken(...)
.
En el servidor
- Crea un extremo nuevo para la autenticación de token de ID.
- Desactiva el extremo anterior después de que se migren tus apps cliente
Migra 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 autenticación del servidor.
Para migrar al flujo de código de Auth del servidor, realiza los siguientes cambios:
Del lado del cliente de Android
- Quita el permiso
GET_ACCOUNTS
(Contactos) si lo solicitas. - Cambia cualquier código mediante
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
oAccountManager.newChooseAccountIntent()
aAuth.GOOGLE_SIGN_IN_API
con Configuración deGoogleSignInOptions.Builder.requestServerAuthCode(...)
.
En el servidor
- Crea un extremo nuevo para el flujo de código de autenticación del servidor.
- Desactiva el extremo anterior después de que se migren tus apps cliente
Aún puedes compartir la lógica de acceso a la API entre los 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); }
Cómo migrar desde el flujo de token de ID de GoogleAuthUtil
Si usas GoogleAuthUtil
para obtener tokens de ID, debes migrar a la nueva
Flujo del token de ID de la API de acceso.
Por ejemplo, si tu código de Android se parece al siguiente ejemplo, deberías migrate:
En el ejemplo, las solicitudes de token de ID usan audience:server:client_id
junto con el
ID de cliente para tu servidor web como el parámetro "scope" para el
GoogleAuthUtil.getToken
llamada
(audience:server:client_id:9414861317621.apps.googleusercontent.com
).
El nuevo flujo de tokens de ID de API de acceso 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 token de ID, realiza los siguientes cambios:
Del lado del cliente de Android
- Quita el permiso
GET_ACCOUNTS
(Contactos) si lo solicitas. - Cambia cualquier código mediante
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
oAccountManager.newChooseAccountIntent()
aAuth.GOOGLE_SIGN_IN_API
con Configuración deGoogleSignInOptions.Builder.requestIdToken(...)
.
En el servidor
La nueva API de Sign-In emite tokens de ID que cumplen con las normas de OpenID Connect
a diferencia de GoogleAuthUtil.getToken
, que usa un formato obsoleto.
En particular, la entidad emisora es ahora https://accounts.google.com
, con un https
.
Durante el proceso de migración, tu servidor debe verificar el token de ID de ambos. para tus clientes de Android antiguos y nuevos. Para verificar ambos formatos del token, realiza los 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, actualiza a la versión 1.1.6 o 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 0.9.7 o a una versión más reciente.
- Python o tus propias implementaciones: Acepta estas dos entidades emisoras:
https://accounts.google.com
yaccounts.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 a la
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, deberías migrate:
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 el
Llamada de GoogleAuthUtil.getToken
(oauth2:server:client_id:9414861317621.apps.googleusercontent.com
).
El nuevo flujo de código de Auth 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 podrá obtener un token de ID. Contiene la información de perfil del usuario cuando realiza el intercambio de códigos de autorizació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 mediante
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
oAccountManager.newChooseAccountIntent()
aAuth.GOOGLE_SIGN_IN_API
con Configuración deGoogleSignInOptions.Builder.requestServerAuthCode(...)
.
En el servidor
Mantén tu código actual, pero especifica https://oauth2.googleapis.com/token
como el extremo del servidor de tokens cuando se construye el
GoogleAuthorizationCodeTokenRequest
para que puedas obtener un token de ID
con el correo electrónico, el ID de usuario y la información del perfil del usuario sin la necesidad de otro
llamada de red. Este extremo es totalmente retrocompatible, y el siguiente código
funcionará para los códigos de autenticación del servidor que se recuperen del Android anterior y el nuevo.
implementaciones de cliente.
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); ...