¿Qué es OAuth y OAuth2? Guía completa
En la industria del software y, de manera especial, en el desarrollo de API y aplicaciones modernas para la web, OAuth se ha convertido en un estándar para la autenticación y autorización de usuarios y sistemas. Es un modelo de trabajo ampliamente extendido y muy poderoso, capaz de satisfacer las necesidades más variadas. En este post te vamos a explicar en qué consiste OAuth y OAuth2, junto con sus diferencias y casos de uso.
¿Qué es OAuth?
OAuth es el acrónimo de Open Authorization, nombre con el que se conoce a este estándar de autenticación y autorización, que permite a usuarios compartir recursos privados entre aplicaciones sin necesidad de compartir sus credenciales. Por tanto, proporciona un método seguro para que las aplicaciones accedan a la información que un usuario tiene en otra aplicación, sin comprometer la seguridad de la aplicación donde residen los datos.
Evolución hacia OAuth2
Desde un tiempo para acá este protocolo para la autorización ha recibido una actualización orientada para mejorar la seguridad del protocolo original OAuth. Gracias a OAuth2 es posible solucionar algunas de las limitaciones de OAuth, a la vez que se proporciona un flujo de autorización más flexible y seguro.
A lo largo de este artículo podrás entender las diferencias entre las versiones de OAuth y OAuth2, con sus diferentes casos de uso.
¿Cómo funciona OAuth?
OAuth establece todo un proceso para la autorización del acceso de los datos de los usuarios entre sistemas. Se trata de un protocolo con un proceso bien definido que vamos a resumir para que puedas entenderlo perfectamente.
Proceso de autorización de OAuth
El proceso de autorización de OAuth se realiza por medio de una serie de pasos, en una comunicación que involucra dos sistemas: una aplicación cliente que desea acceder a los recursos protegidos de un usuario y una aplicación servidor que es quien posee esos recursos.
En líneas generales estos son los pasos del protocolo.
- Solicitud de autorización: El cliente solicita acceso a los recursos protegidos del usuario.
- Permiso del usuario: El usuario se debe autenticar convenientemente en la aplicación servidor y debe autorizar el acceso a los recursos de su cuenta.
- Intercambio de tokens: La aplicación cliente recibe un token de acceso que se utiliza para acceder a los recursos del usuario.
Roles clave en OAuth: cliente, usuario, servidor de recursos y servidor de autorización
Para poder entender el proceso esbozado en el punto anterior debemos definir los distintos roles de los integrantes de este protocolo de autorización:
- Llamamos «cliente» a la aplicación que solicita acceso a los recursos del usuario.
- Por «usuario» se entiende al propietario de los recursos que se desean acceder.
- Luego tenemos al «servidor de recursos«, que es la aplicación donde se alojan los recursos del usuario que se pretenden compartir.
- Por último tenemos al «servidor de autorización» que es el servidor que autentica al usuario y emite los tokens de acceso.
Tipos de flujo en OAuth: código de autorización, implicación, credenciales de cliente y contraseña
OAuth, pero sobre todo la versión más reciente OAuth2, definen varios tipos de flujos de autorización, que determinan cómo una aplicación puede obtener tokens de acceso para actuar en nombre de un usuario, y por tanto, acceder a sus recursos. Los flujos que debemos entender son los siguientes:
- Código de autorización: Es el tipo de flujo más habitual en las aplicaciones web y móviles. En este flujo la aplicación cliente redirige al usuario al servidor de autorización donde el usuario debe iniciar sesión y conceder los permisos. Una vez concedidos los permisos se redirige de nuevo al usuario a la aplicación cliente con un código de autorización. Ese código sirve para enviarlo de nuevo al servidor de autorización para conseguir finalmente el token de acceso.
- Implicación: Utilizado por aplicaciones del lado del cliente, con Javascript, sin necesidad de intervenir un backend. En este caso el token de acceso se obtiene directamente, sin necesidad de un código de autorización. Sin embargo, es un modelo menos seguro, ya que el token de acceso queda expuesto en el navegador.
- Credenciales de cliente: Este tipo de flujo de autorización se usa cuando es la propia aplicación la que tiene que acceder a sus recursos, en lugar de los recursos de un usuario. En este caso es la aplicación la que tiene unas credenciales (un identificador de acceso y una clave de API). Entonces en el servidor se verifican esas credenciales para enviar el token de acceso.
- Contraseña: Es un flujo de acceso más tradicional, por estar basado en un nombre de usuario y contraseña. Se usa cuando las aplicaciones tienen la confianza suficiente para solicitar el nombre de usuario y contraseña directamente.
Gestión y almacenamiento de tokens de acceso
Para garantizar la seguridad de OAuth es muy importante la gestión que se hace de los token de acceso, así como el almacenamiento de los mismos en las aplicaciones de cliente. Por supuesto, los tokens deben ser almacenados de manera segura. No obstante, éstos suelen tener una vida útil limitada, lo que permite minimizar el riesgo por el uso o la exposición indebida.
Funcionamiento del protocolo OAuth
Como hemos señalado anteriormente, el protocolo OAuth tiene diversos tipos de flujos para la obtención de los token de acceso. Dependiendo del caso de uso se aplica uno u otro con el objetivo final de conseguir un token de acceso. Una vez que se entregan los token de acceso las aplicaciones de terceros pueden acceder a los recursos protegidos.
En todos los casos las comunicaciones deben realizarse siempre mediante HTTPS, lo que nos permite garantizar la confidencialidad e integridad de los datos transferidos. En la siguiente imagen se muestra un diagrama de secuencia en UML de los pasos necesarios para la autenticación y autorización del flujo más común de OAuth2: código de autorización.
Diferencias entre OAuth y OAuth2
OAuth2 se lanzó como una actualización del modelo de autorización OAuth básico. Existen algunas diferencias que vamos a comentar a continuación.
Arquitectura y diseño de OAuth vs. OAuth2
OAuth2 ofrece diversas mejoras que permiten ofrecer una arquitectura más flexible y escalable que OAuth, aumentando los casos de uso y la seguridad de las aplicaciones. Los puntos clave de los flujos y arquitectura los vamos a ver en los siguientes puntos.
Métodos de autorización en OAuth y OAuth2
La versión OAuth2 fue la que introdujo dos distintos métodos de autorización que hemos comentado anteriormente, lo que hace que sea un mecanismo más versátil y adaptable a diferentes tipos de aplicaciones y casos de uso.
Seguridad y manejo de tokens en OAuth y OAuth2
Una de las mejoras de OAuth2 que afecta a la seguridad y manejo de los token es la implementación de los tokens de actualización (refresh tokens), que permiten hacer tokens de acceso con una caducidad más corta, con la posibilidad de refrescarlos sin la intervención del usuario, lo que también impacta positivamente en la experiencia del usuario.
Otra de las ventajas introducidas por OAuth2 son los scopes, que permiten indicar qué tipos de permisos se ofrecen sobre los recursos de los usuarios. Esta característica ofrece una ventaja muy significativa gracias a las posibilidades de configuración granular de los permisos sobre los recursos.
Flujo de autorización: comparación de pasos y procesos
Como hemos dicho anteriormente, los flujos de autorización son una de las características más destacables de OAuth2.
Uso y aplicaciones comunes de OAuth y OAuth2
OAuth y OAuth2 se utilizan para casos de uso similares, aunque actualmente OAuth2 ha desplazado prácticamente al antiguo OAuth, por lo que la primera versión se usa apenas en aplicaciones legacy o API poco actualizadas. OAuth, en su primera versión, puede usarse también en entornos que requieran validar todas y cada una de las solicitudes mediante firma con HMAC-SHA1. Sin embargo esta utilidad fue descartada en OAuth2 debido a que era propensa a errores.
Como OAuth2 introdujo nuevos flujos de verificación actualmente resulta mucho más versátil, introduciendo nuevos casos de uso como:
- La autorización en páginas SPA (mediante flujo de implicación)
- El uso de permisos granulares gracias a los scopes
- Arquitecturas de microservicios, que requieran comunicación de distintas aplicaciones distribuidas.
- Integración de distintos proveedores de identidad que funcionan exclusivamente en OAuth2.
Beneficios de usar OAuth2
OAuth2 es un mecanismo seguro, avanzado y versátil para la autenticación y autorización, lo que lo hace muy deseable en las aplicaciones modernas. Algunas de sus ventajas las vamos a detallar en los siguientes puntos.
Seguridad mejorada para aplicaciones y usuarios
Gracias a las actualizaciones de OAuth2 se alcanza un nivel de seguridad más alto, sin comprometer la experiencia de uso de las aplicaciones. Esto se consigue por ejemplo con tokens de acceso con una caducidad más corta, en conjunto con el uso de los refresh tokens para conseguir actualizarlos de manera transparente para el usuario. Además, los scopes introducidos en Oauth2 permiten definir qué recursos van a ser accesibles y cuáles no, lo que también impacta de manera sensible en la seguridad y confidencialidad de los datos.
Facilidad de implementación y uso
La notable implantación de OAuth2 a lo largo de numerosas bibliotecas y frameworks hace que este protocolo de autorización resulte más sencillo de usar y de integrar en las aplicaciones actuales, de manera sencilla y eficiente.
Escalabilidad y flexibilidad en diferentes entornos
Además de los distintos flujos que permiten el aumento de la versatilidad de OAuth2, también es destacable su escalabilidad, ya que es posible manejar un gran número de solicitudes de autorización y autenticación sin comprometer el rendimiento de los servidores de autenticación.
Integración sencilla con múltiples servicios y plataformas
Otra de las ventajas de OAuth2 es la posibilidad de integrar en las aplicaciones de manera sencilla servicios de otras plataformas como Google, Facebook, Twitter, GitHub y muchos otros proveedores de servicios y de autenticación.
Mejor gestión de permisos y acceso de usuarios
Gracias a los mencionados «scopes» es fácil gestionar y controlar qué tipos de permisos se van a otorgar a las aplicaciones que hacen de cliente OAuth2. Así las aplicaciones pueden solicitar los permisos que requieran y los usuarios son capaces de verificar qué alcance se ofrecerá a las aplicaciones de terceros sobre sus datos.
Desafíos y consideraciones de seguridad en OAuth2
OAuth2 ha abierto un mundo de posibilidades a la hora de integrar servicios y conectar aplicaciones distribuidas, sin embargo, todavía existen desafíos y consideraciones sobre seguridad a tener en cuenta.
Prevención de ataques CSRF
Los ataques CSRF (Cross-Site Request Forgery) son una de las amenazas más comunes en las aplicaciones web. Para prevenir este tipo de ataques se deben implementar medidas de protección adicionales, como el uso de tokens CSRF, que aseguran que las solicitudes de autorización vengan de sitios legítimos.
Gestión segura de tokens
La seguridad del protocolo OAuth2 depende mucho de cómo las aplicaciones cliente almacenan y gestionan los token de acceso. Un token de acceso almacenado de manera insegura puede comprometer los datos de los usuarios que han permitido acceso a sus recursos. Es por ello que los token deben tener una vida útil corta y deben además existir formas de revocar los token, para garantizar que se anulen sus permisos en caso de haber sido comprometidos.
Buenas prácticas de implementación
Existen numerosas prácticas que podemos poner en marcha para conseguir que los sistemas de autorización basados en OAuth2 presenten su mejor cara. Algunos de ellos incluyen:
- Uso de HTTPS en las comunicaciones
- Almacenamiento seguro y encriptado de los token de acceso
- Establecer límites de uso de las API
- Usar Scopes para limitar al máximo los permisos de manera granular
- Monitorizar y registrar las actividades de las aplicaciones
Casos de uso de OAuth
Ya hemos explicado algunos casos de uso de los protocolos. No obstante vamos a detallar aquellos que consideramos especialmente destacables.
Acceso a API externas
OAuth permite a las aplicaciones acceder a API externas en nombre de usuarios de los cuáles no conocemos sus propias credenciales. Esta funcionalidad es especialmente importante en numerosas aplicaciones y servicios, ya que nos permite realizar integraciones de APIs y servicios ofrecidos por las redes sociales, servicios de almacenamiento en la nube y muchos otros.
Iniciar sesión sin contraseña
Este protocolo también permite a los usuarios iniciar sesión sin necesitar una contraseña o sin la necesidad de proporcionar de nuevo todos sus datos personales para crear cuentas de usuario en nuevos sitios web. En su lugar, los usuarios pueden autenticarse utilizando sus cuentas de redes sociales o de otros servicios como Google o GitHub que soportan OAuth.
Autenticación en aplicaciones móviles
Otro área donde es frecuente el uso de OAuth son las aplicaciones móviles. Este protocolo ofrece una experiencia fluida y el acceso a recursos protegidos de una manera segura.
Casos de uso de OAuth2
OAuth2 se puede usar en todos los tipos de uso donde ya se usaba OAuth. Sin embargo, gracias a su mayor flexibilidad existen otros casos de uso adicionales.
Inicio de sesión federado
El inicio de sesión federado permite a los usuarios autenticarse en una aplicación utilizando sus usuarios de otros proveedores, como Google, Facebook o Microsoft. Esto ya era posible en OAuth1 pero con la llegada de OAuth2 se simplificó el proceso y se añadieron nuevas utilidades muy importantes como los scopes.
Autenticación en aplicaciones móviles y SPA
Uno de los flujos más novedosos de OAuth2 los encontramos en las aplicaciones de una sola página (Single Page Application = SPA) y las aplicaciones móviles. En estos casos se puede usar el mencionado flujo de implicación, de modo que el proceso de autenticación se puede realizar directamente desde el frontal de la aplicación.
Autorización de aplicaciones cliente
Además de autorizar el acceso de datos de otros usuarios, OAuth2 permite también que las aplicaciones cliente puedan solicitar acceso a recursos propios. Esto es interesante por ejemplo cuando desde un servidor deseamos acceder a APIs externas, por medio de un ID y llave de API (habitualmente llamado «secret»).
Flujos de autenticación modernos
Los flujos de autenticación más versátiles de OAuth2 nos permiten una variedad de flujos de autenticación modernos y adaptables a nuevos escenarios, como la implicación, las credenciales de cliente, o el flujo de contraseña, que nos abren casos de uso adicionales manteniendo la seguridad y la facilidad de uso para los desarrolladores, manteniendo una rica experiencia de usuario.