El problema fundamental que aborda la personalización de scopes en OAuth es la tensión entre la conveniencia para el desarrollador y el control de seguridad para el usuario en sistemas de autorización delegada. Tradicionalmente, OAuth presentaba un modelo de "todo o nada" en la pantalla de consentimiento, donde el usuario debía aprobar todos los permisos solicitados por una aplicación o denegar la autorización por completo. Esto generaba un riesgo de sobre-privilegio (least privilege principle violation) y una fricción significativa para el usuario, especialmente en aplicaciones que, aunque teóricamente podrían usar un amplio conjunto de permisos, en la práctica solo necesitan un subconjunto para una tarea específica.
La necesidad de esta funcionalidad surge de la creciente complejidad y granularidad de los permisos en APIs modernas, como las de Cloudflare. A medida que las plataformas exponen más capacidades a través de APIs, la lista de posibles scopes se expande. Forzar a los usuarios a aceptar todos los scopes solicitados, incluso los que no son estrictamente necesarios para la función principal de la aplicación, es una práctica subóptima desde una perspectiva de seguridad y usabilidad. Esta mejora permite a los usuarios aplicar el principio de mínimo privilegio de manera activa, seleccionando solo los permisos esenciales para la tarea en cuestión.
Arquitectura del Sistema
La implementación de la personalización de scopes se integra en el flujo de autorización OAuth 2.0 existente. Los desarrolladores configuran un cliente OAuth especificando una lista de scopes y, adicionalmente, una lista de optional_scopes. Ambas listas son parte de la configuración del cliente en el Authorization Server. Cuando un cliente inicia un flujo de autorización, envía una solicitud que incluye los scopes que desea. El Authorization Server evalúa esta solicitud contra la configuración del cliente.
Durante la fase de consentimiento, la pantalla de autorización presenta al usuario los scopes solicitados. Los scopes que están presentes tanto en la solicitud del cliente como en la lista optional_scopes configurada para ese cliente, se marcan como deseleccionables por el usuario. Los scopes que están en la solicitud pero no en optional_scopes se consideran obligatorios. Si el usuario deselecciona scopes opcionales, el Authorization Server emite un access_token que contiene solo el subconjunto de scopes efectivamente consentidos. Es crucial que la aplicación cliente, después de intercambiar el authorization_code por un access_token, inspeccione los scopes reales otorgados en el token, en lugar de asumir que se concedió el conjunto completo solicitado. Esto requiere que las aplicaciones sean resilientes a grants parciales y adapten su comportamiento en consecuencia.
Flujo de Autorización OAuth con Scopes Opcionales
- 1 Desarrollador Configura cliente OAuth con 'scopes' y 'optional_scopes' en Authorization Ser...
- 2 Aplicación Cliente Inicia flujo de autorización, solicitando un conjunto de scopes.
- 3 Authorization Server Evalúa scopes solicitados contra configuración del cliente (obligatorios/opci...
- 4 Usuario Visualiza pantalla de consentimiento, deselecciona scopes opcionales si lo de...
- 5 Authorization Server Emite 'authorization_code' con scopes consentidos.
- 6 Aplicación Cliente Intercambia 'authorization_code' por 'access_token'.
- 7 Aplicación Cliente Inspecciona 'access_token' para determinar los scopes realmente otorgados.
- 8 Aplicación Cliente Opera con los permisos concedidos, adaptándose a grants parciales.
Trade-offs
Ganancias
- ▲ Seguridad (Principio de Mínimo Privilegio)
- ▲ Control del Usuario
- ▲ Confianza del Usuario
Costes
- △ Complejidad para el Desarrollador (manejo de grants parciales)
curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/oauth_clients" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--header "Content-Type: application/json" \
--data '{
"client_name": "ACME Corp",
"redirect_uris": [
"https://acme.org/oauth/callback"
],
"grant_types": [
"authorization_code"
],
"response_types": [
"code"
],
"token_endpoint_auth_method": "client_secret_basic",
"scopes": [
"user-details.read",
"workers-scripts.write",
"workers-kv-storage.write",
"zone.read"
],
"optional_scopes": [
"workers-kv-storage.write",
"zone.read"
]
}'Fundamentos Teóricos
El concepto de autorización delegada y la gestión de permisos se remonta a los sistemas de control de acceso basados en roles (RBAC) y control de acceso basado en atributos (ABAC), que buscan definir y hacer cumplir políticas de acceso. OAuth 2.0, aunque es un framework de autorización, se apoya en estos principios para delegar la autoridad de un recurso. La problemática de la granularidad en el consentimiento se relaciona directamente con el principio de mínimo privilegio, un concepto fundamental en seguridad informática que postula que un sujeto (en este caso, una aplicación cliente) debe tener solo los permisos necesarios para realizar su función y nada más. Este principio fue formalizado por Jerome Saltzer y Michael Schroeder en su seminal paper "The Protection of Information in Computer Systems" (1975), donde se discuten los principios de diseño para sistemas seguros, incluyendo la necesidad de una autorización precisa y limitada. La implementación de scopes opcionales es una aplicación práctica de este principio en un contexto de sistemas distribuidos y APIs, permitiendo que el usuario final sea un actor activo en la aplicación de dicho principio.