OAuth e identidad delegada
Todo botón de "Iniciar sesión con Google" es una decisión de no implementar un sistema de contraseñas propio.
Tu app no verifica ninguna contraseña, no confirma quién es la persona y nunca almacena una credencial. Le pregunta a un proveedor en el que ya confía, y acepta la respuesta.
El protocolo detrás de esto es OAuth, y el flujo tiene más piezas en movimiento de las que el botón sugiere.
Dos autorizaciones distintas
Hay algo que confunde a casi todo el mundo, y vale la pena aclararlo antes de seguir con el flujo.
Ya viste la pantalla de consentimiento: una app que pide tu nombre, tu foto de perfil y tu correo electrónico. A veces pide más, a veces mucho más, como contactos, calendario y todos los mensajes de tu bandeja de entrada.
Esa pantalla es de autorización, y no tiene nada que ver con los roles de tu app. Decide a qué partes de la cuenta de Google del usuario puede acceder tu app, y esos permisos se llaman scopes.
Tus propios roles de administrador y usuario se siguen decidiendo dentro de tu back end, después de que termina el login, tal como en los capítulos anteriores.
OAuth autoriza, OIDC identifica
En rigor, OAuth otorga una autorización delegada: permiso para que tu app actúe sobre un recurso. La capa de identidad construida encima de eso es OpenID Connect, u OIDC, y los botones de "iniciar sesión con" son OIDC.
Esta distinción importa en el código. Un access token de OAuth dice a qué puede acceder tu app; un ID token de OIDC dice quién es el usuario. Tratar el primero como prueba de identidad es un error común y real.
Google decide qué datos de tu cuenta de Google puede ver la app. Tu app decide qué puede hacer esa persona una vez que entra. Preguntas distintas, lugares distintos, respuestas distintas.
El ida y vuelta
Ocho pasos, y en medio de ellos el usuario sale de tu app:
- El usuario presiona el botón en tu app.
- Tu app lo redirige a Google.
- El usuario inicia sesión, directamente con Google. Tu app no ve nada de esto.
- Google muestra la pantalla de consentimiento para los scopes que pediste.
- Si el usuario acepta, Google le envía a tu servidor un código de aprobación de un solo uso. Este código no inicia sesión de nadie. Representa el consentimiento, nada más.
- Tu servidor envía ese código directamente de vuelta a Google, junto con las credenciales secretas de tu propia app.
- Esas credenciales le prueban a Google que la solicitud vino de tu back end.
- Google responde con un ID token que dice quién es el usuario, y tu app inicia su sesión.
La entrega en dos pasos entre el cinco y el ocho es la parte que vale la pena entender bien. El código viaja a través del navegador del usuario y por sí solo no sirve de nada; el token que realmente importa se intercambia entre servidores, donde ningún navegador lo llega a ver.
Ahí está la gracia: no puedes filtrar una credencial que nunca recibiste.
Tres formas en que puede fallar
Mandar al usuario fuera de tu app y confiar en que el proveedor lo devuelva abre tres brechas silenciosas.
| Qué falla | Por qué importa | La solución | |
|---|---|---|---|
| 1 | Pedir demasiado | Los scopes que van más allá de lo que la app usa hacen que una filtración exponga mucho más de lo debido, y los usuarios pierden confianza en una app que parece entrometida. Divulgación de información | Pide el conjunto mínimo que realmente necesitan tus funciones |
| 2 | Filtración del código de aprobación | El código aparece en la barra de URL, el historial del navegador, analytics o los logs del servidor. Cualquiera que lo vea antes de que expire puede completar el login como ese usuario. Suplantación | Mantenlo fuera de todo lo que quede registrado, e intercámbialo de inmediato |
| 3 | Confiar en el ID token sin verificarlo | Cualquiera puede escribir un token que parezca válido. Solo Google puede firmar uno de verdad. Aceptarlo sin verificar le permite a un atacante hacerse pasar por cualquiera. Suplantación | Verifica la firma, la audiencia y la expiración antes de confiar en cualquier cosa que contenga |
El punto 3 es el que echa por tierra todo el modelo. La idea de delegar era que un tercero de confianza responde por el usuario; saltarse la verificación significa que terminas confiando en quien sea que haya enviado la solicitud.
Cualquiera puede escribir una nota. Verificar la firma es cómo sabes que esta vino de Google, y saltarse esa verificación es confiar en una letra que nunca has visto.
Ponlo a prueba
Cinco situaciones de una integración real con OAuth. Identifica el error, el riesgo y la solución.
- Tu app solo necesita un correo electrónico para iniciar sesión, pero la solicitud de OAuth también pide contactos, calendario y archivos de Drive.
- La pantalla de consentimiento advierte que tu app quiere permiso para eliminar eventos del calendario. Tu app nunca toca Calendar.
- Después del login, la página muestra brevemente el código de aprobación de corta duración en la URL.
- Tu back end recibe el ID token y lo acepta sin verificar la firma ni para quién fue emitido.
- Tu back end acepta un ID token que expiró hace una hora.
Compara tus respuestas
| # | Error | Riesgo | Solución |
|---|---|---|---|
| 1 | Pedir demasiado | Un token filtrado expone mucho más de la cuenta del usuario de lo que la app necesitaba | Pide solo los scopes que una función realmente usa |
| 2 | Pedir demasiado | La misma exposición, más una pantalla de consentimiento que hace ver a la app como poco confiable antes de que nadie la haya usado | Elimina el scope que no se usa |
| 3 | Código de aprobación filtrado | Las URLs quedan registradas, guardadas y se comparten. Quien capture el código antes de que expire puede completar el login | Mantén los códigos fuera de la URL, intercámbialos de inmediato |
| 4 | Confiar en el ID token | Cualquiera puede falsificar algo con forma de token. Sin verificar firma y audiencia, un atacante puede hacerse pasar por cualquier usuario | Verifica la firma y la audiencia antes de confiar en él |
| 5 | Confiar en el ID token | Un token viejo puede reutilizarse para iniciar sesión repetidamente como ese usuario | Revisa la expiración y rechaza cualquier token vencido |
Los puntos dos y uno son el mismo error con consecuencias distintas, por eso vale la pena leer la lista como tres problemas y no como cinco. Los puntos cuatro y cinco también son un solo error: la verificación es un conjunto de controles, y saltarse cualquiera de ellos es saltarse la verificación.
Hacia dónde va esto
Tres modelos, cada uno resolviendo el mismo problema desde un ángulo distinto. El servidor recuerda, el cliente lleva la prueba, o un proveedor responde por ti.
Cómo elegir un modelo de identidad pone los tres uno al lado del otro y explica cuándo cada uno es la respuesta correcta.

