tl; dr: Todo esto se debe a razones de seguridad.
OAuth 2.0 quería cumplir estos dos criterios:
- Desea permitir que los desarrolladores utilicen URI de redireccionamiento no HTTPS porque no todos los desarrolladores tienen un servidor habilitado para SSL y, si lo hacen, no siempre está configurado correctamente (certificados SSL confiables, no autofirmados, reloj de servidor sincronizado ...).
- No desea que los piratas informáticos puedan robar tokens de acceso / actualización interceptando solicitudes.
Detalles abajo:
El flujo implícito solo es posible en un entorno de navegador por razones de seguridad:
En el flujo implícito, el token de acceso se pasa directamente como un fragmento hash (no como un parámetro de URL). Una cosa importante sobre el fragmento hash es que, una vez que sigue un enlace que contiene un fragmento hash, solo el navegador es consciente del fragmento hash. Los navegadores pasarán el fragmento hash directamente a la página web de destino (el URI de redireccionamiento / la página web del cliente). El fragmento de hash tiene las siguientes propiedades:
- No son parte de la solicitud HTTP, por lo tanto, no pueden ser leídos por los servidores y por eso no pueden ser interceptados por servidores / enrutadores intermedios (esto es importante).
- Solo existen en el navegador, en el lado del cliente, por lo que la única forma de leer el fragmento hash es usar JavaScript que se ejecuta en la página.
Esto hace posible pasar un token de acceso directamente al cliente sin el riesgo de que sea interceptado por un servidor intermediario. Esto tiene la advertencia de que solo es posible en el lado del cliente y necesita que JavaScript se ejecute en el lado del cliente para usar el token de acceso.
El flujo implícito también tiene problemas de seguridad que requieren más lógica para solucionar / evitar, por ejemplo:
- Un atacante podría obtener un token de acceso de un usuario en un sitio web / aplicación diferente (digamos si es el propietario del otro sitio web / aplicación), registrar el token en su sitio web y luego pasarlo como un parámetro de URL en su sitio web por lo tanto, suplantando al usuario en su sitio web. Para evitar esto, debe verificar el ID de cliente asociado con el token de acceso (por ejemplo, para Google, puede usar el punto final de tokeninfo) para asegurarse de que el token haya sido emitido con su propio ID de cliente (es decir, mediante su propia aplicación) o verificar la firma si está utilizando un IDToken (pero eso requiere su secreto de cliente).
- Si la solicitud de autenticación no se originó en su propia propiedad (llamada ataques de fijación de sesión), para evitar esto, querrá generar un hash aleatorio desde su sitio web, guárdelo en una cookie y pase el mismo hash en el parámetro de URL de estado de la solicitud de autenticación, cuando el usuario regresa, verifica el parámetro de estado con la cookie y debe coincidir.
En el flujo del código de autorización, no es posible pasar un token de acceso directamente en un parámetro de URL porque los parámetros de URL son parte de la solicitud HTTP, por lo tanto, cualquier servidor / enrutador intermediario por el que pasaría su solicitud (podría ser cientos) podría lea el token de acceso si no está utilizando una conexión cifrada (HTTPS) que permite lo que se conoce como ataques Man-in-the-middle.
En teoría, pasar el token de acceso directamente en un parámetro de URL podría ser posible, pero el servidor de autenticación debería asegurarse de que el URI de redireccionamiento use HTTPS con cifrado TLS y un certificado SSL 'confiable' (generalmente de una Autoridad de Certificación que no es gratuita) para asegurarse de que el servidor de destino es legítimo y que la solicitud HTTP está completamente encriptada. Hacer que todos los desarrolladores compren un certificado SSL y configuren SSL correctamente en su dominio sería un gran problema y reduciría enormemente la adopción. Esta es la razón por la cual se proporciona un "código de autorización" de un solo uso intermediario que solo el receptor legítimo podrá intercambiar (porque necesita el secreto del cliente) y que el código será inútil para los posibles piratas informáticos que interceptan las solicitudes sobre transacciones no cifradas (porque no lo hacen
También podría argumentar que el flujo implícito es menos seguro, hay posibles vectores de ataque como falsificar el dominio al redirigirlo, por ejemplo, secuestrando la dirección IP del sitio web del cliente. Esta es una de las razones por las que el flujo implícito solo otorga tokens de acceso (que se supone que tienen un uso de tiempo limitado) y nunca actualiza los tokens (que son ilimitados en el tiempo). Para solucionar este problema, le aconsejo que aloje sus páginas web en un servidor habilitado para HTTPS siempre que sea posible.