Antecedentes: he escrito pilas de clientes y servidores para OAuth 1.0a y 2.0.
Tanto OAuth 1.0a como 2.0 admiten la autenticación de dos patas , donde un servidor tiene asegurada la identidad de un usuario, y la autenticación de tres patas , donde un servidor está asegurado por un proveedor de contenido de la identidad del usuario. La autenticación de tres patas es donde entran en juego las solicitudes de autorización y los tokens de acceso, y es importante tener en cuenta que OAuth 1 también los tiene.
El complejo: autenticación de tres patas
Un punto principal de las especificaciones de OAuth es que un proveedor de contenido (por ejemplo, Facebook, Twitter, etc.) asegure a un servidor (por ejemplo, una aplicación web que desea hablar con el proveedor de contenido en nombre del cliente) que el cliente tiene alguna identidad . Lo que ofrece la autenticación de tres patas es la capacidad de hacerlo sin que el cliente o el servidor necesiten conocer los detalles de esa identidad (por ejemplo, nombre de usuario y contraseña).
Sin (?) Profundizar demasiado en los detalles de OAuth:
- El cliente envía una solicitud de autorización al servidor, que valida que el cliente es un cliente legítimo de su servicio.
- El servidor redirige al cliente al proveedor de contenido para solicitar acceso a sus recursos.
- El proveedor de contenido valida la identidad del usuario y, a menudo, solicita su permiso para acceder a los recursos.
- El proveedor de contenido redirige al cliente de regreso al servidor, notificándolo de éxito o falla. Esta solicitud incluye un código de autorización en caso de éxito.
- El servidor realiza una solicitud fuera de banda al proveedor de contenido e intercambia el código de autorización por un token de acceso.
El servidor ahora puede realizar solicitudes al proveedor de contenido en nombre del usuario pasando el token de acceso.
Cada intercambio (cliente-> servidor, servidor-> proveedor de contenido) incluye la validación de un secreto compartido, pero como OAuth 1 puede ejecutarse a través de una conexión no cifrada, cada validación no puede pasar el secreto por el cable.
Eso está hecho, como ya lo notó, con HMAC. El cliente utiliza el secreto que comparte con el servidor para firmar los argumentos de su solicitud de autorización. El servidor toma los argumentos, los firma con la clave del cliente y puede ver si se trata de un cliente legítimo (en el paso 1 anterior).
Esta firma requiere que tanto el cliente como el servidor acuerden el orden de los argumentos (por lo que firman exactamente la misma cadena), y una de las principales quejas sobre OAuth 1 es que requiere que tanto el servidor como los clientes ordenen y firmar de forma idéntica. Este es un código incómodo y es correcto o se obtiene 401 Unauthorized
con poca ayuda. Esto aumenta la barrera para escribir un cliente.
Al requerir que la solicitud de autorización se ejecute a través de SSL, OAuth 2.0 elimina la necesidad de ordenar y firmar argumentos por completo. El cliente pasa su secreto al servidor, que lo valida directamente.
Los mismos requisitos están presentes en la conexión del servidor-> proveedor de contenido, y dado que es SSL que elimina una barrera para escribir un servidor que accede a los servicios de OAuth.
Eso facilita mucho las cosas en los pasos 1, 2 y 5 anteriores.
Entonces, en este punto, nuestro servidor tiene un token de acceso permanente que es un nombre de usuario / contraseña equivalente para el usuario. Puede realizar solicitudes al proveedor de contenido en nombre del usuario pasando ese token de acceso como parte de la solicitud (como argumento de consulta, encabezado HTTP o datos de formulario POST).
Si se accede al servicio de contenido solo a través de SSL, hemos terminado. Si está disponible a través de HTTP simple, nos gustaría proteger ese token de acceso permanente de alguna manera. Cualquiera que detecte la conexión podrá obtener acceso al contenido del usuario para siempre.
La forma en que se resuelve en OAuth 2 es con un token de actualización . El token de actualización se convierte en el equivalente de contraseña permanente, y solo se transmite a través de SSL . Cuando el servidor necesita acceso al servicio de contenido, intercambia el token de actualización por un token de acceso de corta duración. De esa manera, todos los accesos HTTP sniffable se realizan con un token que caducará. Google está utilizando una caducidad de 5 minutos en sus API de OAuth 2.
Entonces, aparte de los tokens de actualización, OAuth 2 simplifica todas las comunicaciones entre el cliente, el servidor y el proveedor de contenido. Y los tokens de actualización solo existen para proporcionar seguridad cuando se accede al contenido sin cifrar.
Autenticación de dos patas
Sin embargo, a veces, un servidor solo necesita controlar el acceso a su propio contenido. La autenticación de dos patas permite al cliente autenticar al usuario directamente con el servidor.
OAuth 2 estandariza algunas extensiones de OAuth 1 que se usaban ampliamente. El que mejor conozco fue presentado por Twitter como xAuth . Puede verlo en OAuth 2 como Credenciales de contraseña del propietario del recurso .
Esencialmente, si puede confiar en el cliente las credenciales del usuario (nombre de usuario y contraseña), pueden intercambiarlas directamente con el proveedor de contenido por un token de acceso. Esto hace que OAuth sea mucho más útil en aplicaciones móviles: con la autenticación de tres patas, debe incrustar una vista HTTP para manejar el proceso de autorización con el servidor de contenido.
Con OAuth 1, esto no era parte del estándar oficial y requería el mismo procedimiento de firma que todas las demás solicitudes.
Acabo de implementar el lado del servidor de OAuth 2 con las credenciales de contraseña del propietario del recurso, y desde la perspectiva del cliente, obtener el token de acceso se ha vuelto simple: solicite un token de acceso del servidor, pasando el ID / secreto del cliente como un encabezado de autorización HTTP y inicio de sesión / contraseña del usuario como datos del formulario.
Ventaja: simplicidad
Entonces, desde la perspectiva de un implementador, las principales ventajas que veo en OAuth 2 están en una complejidad reducida. No requiere el procedimiento de firma de solicitud, lo cual no es exactamente difícil, pero ciertamente es complicado. Reduce en gran medida el trabajo requerido para actuar como cliente de un servicio, que es donde (en el mundo moderno y móvil) desea minimizar el dolor. La complejidad reducida en el servidor-> proveedor de contenido final lo hace más escalable en el centro de datos.
Y codifica en el estándar algunas extensiones de OAuth 1.0a (como xAuth) que ahora se usan ampliamente.