Descripción general
El 16 de febrero de 2022, anunciamos planes para mejorar la seguridad de las interacciones de Google OAuth mediante flujos más seguros. Esta guía te ayuda a comprender los cambios y los pasos necesarios para migrar con éxito del flujo fuera de banda (OOB) de OAuth a alternativas compatibles.
Este esfuerzo es una medida de protección contra la suplantación de identidad (phishing) y los ataques de robo de identidad de apps durante las interacciones con los extremos de autorización de OAuth 2.0 de Google.
¿Qué es OOB?
Fuera de banda (OOB) de OAuth, también conocida como opción de copiar y pegar manualmente, es un flujo heredado desarrollado para admitir clientes nativos que no tienen un URI de redireccionamiento a fin de aceptar las credenciales después de que un usuario aprueba una solicitud de consentimiento de OAuth. El flujo de OOB representa un riesgo de suplantación de identidad (phishing) remoto, y los clientes deben migrar a un método alternativo para protegerse de esta vulnerabilidad.El flujo de OOB dejará de estar disponible para todos los tipos de clientes, como las aplicaciones web, Android, iOS y la plataforma universal de Windows (UWP), apps de Chrome, TVs y dispositivos de entrada limitada, apps de escritorio.
Fechas clave de cumplimiento
- 28 de febrero de 2022: Se bloqueó el nuevo uso de OAuth para el flujo de OOB
- 5 de septiembre de 2022: Es posible que se muestre un mensaje de advertencia al usuario en las solicitudes de OAuth que no cumplan con las políticas.
- 3 de octubre de 2022: El flujo de OOB dejó de estar disponible para los clientes de OAuth creados antes del 28 de febrero de 2022.
- 31 de enero de 2023: Se bloquearán todos los clientes existentes (incluidos los clientes exentos)
Se mostrará un mensaje de error para los usuarios que no cumplan con las políticas. El mensaje indicará a los usuarios que la app está bloqueada mientras se muestra el correo electrónico de asistencia que registraste en la pantalla de consentimiento de OAuth en la Consola de API de Google.
- Determine si este problema lo afecta.
- Migra a una alternativa más segura si te afecta.
Determine si este problema le afecta
Esta baja solo se aplica a las apps en producción (es decir, las apps con el estado de publicación configurado como En producción). El flujo seguirá funcionando para las apps con el estado de publicación de pruebas.
Revisa el estado de publicación en Consent Screen pagede OAuth de Google API Console y continúa con el siguiente paso si usas el flujo de OOB en un proyecto con el estado de publicación “En producción”.
Cómo determinar si tu app usa el flujo de OOB
Inspecciona el código de tu app o la llamada de red saliente (en caso de que tu app use una biblioteca de OAuth) para determinar si la solicitud de autorización de Google OAuth usa un valor de URI de redireccionamiento de OOB.
Inspeccione el código de su aplicación
redirect_uri
tiene alguno de los siguientes valores:redirect_uri=urn:ietf:wg:oauth:2.0:oob
redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
redirect_uri=oob
https://accounts.google.com/o/oauth2/v2/auth? response_type=code& scope=<SCOPES>& state=<STATE>& redirect_uri=urn:ietf:wg:oauth:2.0:oob& client_id=<CLIENT_ID>
Inspeccionar la llamada de red saliente
- Aplicación web: Inspeccionar la actividad de red en Chrome
- Android: Inspecciona el tráfico de red con el Inspector de red
-
Apps de Chrome
- Navega hasta la página de extensiones de Chrome.
- Marca la casilla de verificación Modo de desarrollador en la esquina superior derecha de la página de la extensión.
- Seleccione la extensión que desea supervisar
- Haz clic en el vínculo Página de fondo en la sección Inspeccionar vistas de la página de la extensión.
- Se abrirá una ventana emergente de Herramientas para desarrolladores, en la que podrás supervisar el tráfico de red en la pestaña Red.
- iOS: Cómo analizar el tráfico HTTP con instrumentos
- Plataforma universal de Windows (UWP): Inspeccionar el tráfico de red en Visual Studio
- Apps de escritorio: Usa una herramienta de captura de red disponible para el sistema operativo para el que se desarrolló la app.
redirect_uri
tiene alguno de los siguientes valores:redirect_uri=urn:ietf:wg:oauth:2.0:oob
redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
redirect_uri=oob
https://accounts.google.com/o/oauth2/v2/auth? response_type=code& scope=<SCOPES>& state=<STATE>& redirect_uri=urn:ietf:wg:oauth:2.0:oob& client_id=<CLIENT_ID>
Migra a una alternativa segura
Clientes para dispositivos móviles (Android / iOS)
Si determinas que tu app usa el flujo OOB con un tipo de cliente de OAuth para Android o iOS, debes migrar a nuestros SDK para dispositivos móviles de Acceso con Google (Android y iOS).
El SDK facilita el acceso a las API de Google y controla todas las llamadas a los extremos de autorización de OAuth 2.0 de Google.
En los siguientes vínculos de documentación, se proporciona información para usar los SDK de Acceso con Google a fin de acceder a las API de Google sin usar un URI de redireccionamiento de OOB.
Acceso a las API de Google en Android
Acceso del servidor (sin conexión)
En el siguiente ejemplo, se muestra cómo acceder a las APIs de Google en el servidor en Android.Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data); try { GoogleSignInAccount account = task.getResult(ApiException.class); // request a one-time authorization code that your server exchanges for an // access token and sometimes refresh token String authCode = account.getServerAuthCode(); // Show signed-in UI updateUI(account); // TODO(developer): send code to server and exchange for access/refresh/ID tokens } catch (ApiException e) { Log.w(TAG, "Sign-in failed", e); updateUI(null); }
Consulta la guía de acceso del servidor para acceder a las API de Google desde el servidor.
Accede a las API de Google en una app para iOS
Acceso del cliente
En el siguiente ejemplo, se muestra cómo acceder a las API de Google en el cliente en iOS.
user.authentication.do { authentication, error in guard error == nil else { return } guard let authentication = authentication else { return } // Get the access token to attach it to a REST or gRPC request. let accessToken = authentication.accessToken // Or, get an object that conforms to GTMFetcherAuthorizationProtocol for // use with GTMAppAuth and the Google APIs client library. let authorizer = authentication.fetcherAuthorizer() }
Usa el token de acceso a fin de llamar a la API, ya sea mediante la inclusión del token de acceso en el encabezado de una solicitud de REST o gRPC (Authorization: Bearer ACCESS_TOKEN
), o mediante el autorizador de obtención (GTMFetcherAuthorizationProtocol
) con la
biblioteca cliente de las API de Google para Objective-C para REST.
Consulta la guía de acceso del cliente para obtener información sobre cómo acceder a las API de Google del cliente. sobre cómo acceder a las API de Google en el cliente.
Acceso al servidor (sin conexión)
En el siguiente ejemplo, se muestra cómo acceder a las API de Google en el servidor para admitir un cliente de iOS.GIDSignIn.sharedInstance.signIn(with: signInConfig, presenting: self) { user, error in guard error == nil else { return } guard let user = user else { return } // request a one-time authorization code that your server exchanges for // an access token and refresh token let authCode = user.serverAuthCode }
Revisa la guía de acceso del servidor para acceder a las API de Google desde el servidor.
Cliente de Chrome App
Si determinas que tu app usa el flujo de OOB en el cliente de la app de Chrome, debes migrar al uso de la API de Chrome Identity.
En el siguiente ejemplo, se muestra cómo obtener todos los contactos del usuario sin el uso de un URI de redireccionamiento OOB.
window.onload = function() { document.querySelector('button').addEventListener('click', function() { // retrieve access token chrome.identity.getAuthToken({interactive: true}, function(token) { // .......... // the example below shows how to use a retrieved access token with an appropriate scope // to call the Google People API contactGroups.get endpoint fetch( 'https://people.googleapis.com/v1/contactGroups/all?maxMembers=20&key=API_KEY', init) .then((response) => response.json()) .then(function(data) { console.log(data) }); }); }); };
Revisa la guía de la API de Chrome Identity para obtener más información sobre cómo acceder a los usuarios de autenticación y llamar a los extremos de Google con la API de Chrome Identity.
Aplicación web
Si determinas que tu app usa el flujo de OOB para una aplicación web, debes migrar a una de nuestras bibliotecas cliente de la API de Google. Las bibliotecas cliente para los distintos lenguajes de programación se enumeran aquí.
Las bibliotecas facilitan el acceso a las API de Google y el manejo de todas las llamadas a los extremos de Google.
Acceso al servidor (sin conexión)
- Prepara un servidor y define un extremo de acceso público (el URI de redireccionamiento) para recibir el código de autorización.
- Configura el URI de redireccionamiento en el Credentials page del Google API Console
En el siguiente fragmento de código, se muestra un ejemplo de Node.js sobre el uso de la API de Google Drive para enumerar los archivos de Google Drive de un usuario en el servidor sin usar un URI de redireccionamiento de OOB.
async function main() { const server = http.createServer(async function (req, res) { if (req.url.startsWith('/oauth2callback')) { let q = url.parse(req.url, true).query; if (q.error) { console.log('Error:' + q.error); } else { // Get access and refresh tokens (if access_type is offline) let { tokens } = await oauth2Client.getToken(q.code); oauth2Client.setCredentials(tokens); // Example of using Google Drive API to list filenames in user's Drive. const drive = google.drive('v3'); drive.files.list({ auth: oauth2Client, pageSize: 10, fields: 'nextPageToken, files(id, name)', }, (err1, res1) => { // TODO(developer): Handle response / error. }); } } }
Consulta la guía de aplicaciones web del servidor para acceder a las API de Google desde el servidor.
Acceso del cliente
En el siguiente fragmento de código, en JavaScript, se muestra un ejemplo del uso de la API de Google para acceder a los eventos del calendario del usuario del cliente.
// initTokenClient() initializes a new token client with your // web app's client ID and the scope you need access to const client = google.accounts.oauth2.initTokenClient({ client_id: 'YOUR_GOOGLE_CLIENT_ID', scope: 'https://www.googleapis.com/auth/calendar.readonly', // callback function to handle the token response callback: (tokenResponse) => { if (tokenResponse && tokenResponse.access_token) { gapi.client.setApiKey('YOUR_API_KEY'); gapi.client.load('calendar', 'v3', listUpcomingEvents); } }, }); function listUpcomingEvents() { gapi.client.calendar.events.list(...); }
Revisa la guía de aplicaciones web del cliente para acceder a las API de Google desde el cliente.
Cliente para computadoras de escritorio
Si determinas que tu app usa el flujo de OOB en un cliente de escritorio, debes migrar al
flujo de dirección IP de bucle invertido (localhost
o 127.0.0.1
).