¿Qué son los Metadatos de Recursos Protegidos de OAuth 2.0?
Los Metadatos de Recursos Protegidos de OAuth 2.0 son un formato estandarizado definido en RFC 9728 . Ayuda a los clientes y servidores de autorización a entender cómo interactuar con los recursos protegidos.
Este formato de metadatos proporciona información esencial sobre:
- Capacidades del servidor de recursos
- Formatos de token soportados
- Mecanismos de seguridad requeridos
- Relaciones con el servidor de autorización
- Alcances y permisos disponibles
¿Cuáles son los beneficios de los Metadatos de Recursos Protegidos?
En el sistema OAuth 2.0, hay cuatro roles básicos:
- Servidor de autorización (Authorization server) : Emite access tokens a los clientes después de autenticar exitosamente al resource owner
- Cliente (Client) : Aplicación que solicita acceso a recursos protegidos
- Propietario del recurso (Resource owner) : Entidad capaz de otorgar acceso a recursos protegidos
- Servidor de recursos (Resource server) : Servidor que aloja recursos protegidos
Tradicionalmente, cuando un cliente necesita acceder a recursos protegidos, primero debe descubrir e interactuar con el servidor de autorización para obtener los tokens necesarios. El rol del Resource Server se limitaba principalmente a validar tokens y servir recursos, con todos los detalles de autenticación y autorización coordinados a través del servidor de autorización y la aplicación cliente.
Esto significaba que los clientes no tenían una forma estandarizada de descubrir los requisitos o capacidades específicos de un Resource Server directamente.
Los Metadatos de Recursos Protegidos transforman esta dinámica al permitir que los Resource Servers publiquen activamente sus requisitos y capacidades, y trae varios beneficios clave:
- Descubrimiento Directo: Los clientes ahora pueden conocer los requisitos de un Resource Server directamente desde la fuente
- Autonomía Mejorada: Los Resource Servers pueden especificar explícitamente sus formatos de token soportados, mecanismos de seguridad y servidores de autorización de confianza
- Interoperabilidad Mejorada: Un formato estandarizado asegura una comunicación consistente de los requisitos de acceso a través de diferentes implementaciones
- Configuración Dinámica: Los Resource Servers pueden actualizar sus requisitos sin depender de cambios en el servidor de autorización
¿Cómo funcionan los Metadatos de Recursos Protegidos de OAuth 2.0?
Los Metadatos de Recursos Protegidos operan dentro del ecosistema OAuth 2.0 a través de un proceso estandarizado de descubrimiento e interacción:
El documento de metadatos del servidor de recursos es un objeto JSON que contiene los siguientes campos:
{
"resource": "https://api.example.com",
"authorization_servers": [
"https://auth.example.com"
],
"scopes_supported": ["read", "write"],
"token_formats_supported": ["jwt"],
"token_introspection_endpoint": "https://api.example.com/introspect",
"dpop_signing_alg_values_supported": ["ES256", "PS256"]
}
Y una vez que el cliente ha recibido el documento de metadatos, puede usarlo para configurarse e interactuar con el servidor de recursos principalmente de acuerdo con los siguientes campos:
resource
: Identificador del recurso protegidoauthorization_servers
: Lista de servidores de autorización autorizadosscopes_supported
: Alcances disponibles para este recursotoken_formats_supported
: Formatos de token soportadostoken_introspection_endpoint
: Endpoint para la validación de tokensdpop_signing_alg_values_supported
: Algoritmos DPoP soportados
¿Cómo descubrir los endpoints de Metadatos de Recursos Protegidos de OAuth 2.0?
Existen dos mecanismos principales de descubrimiento para los Metadatos de Recursos Protegidos:
- Descubrimiento de Cabecera WWW-Authenticate (Basado en Flujo):
Cuando un cliente realiza una solicitud no autorizada a un recurso protegido, el servidor responde con un código de estado 401 e incluye la URL de metadatos en la cabecera WWW-Authenticate:
# 1. El cliente realiza una solicitud sin token
GET /api/resource HTTP/1.1
Host: api.example.com
# 2. El servidor responde con 401 y URL de metadatos
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="example",
scope="read write",
resource_metadata_url="https://api.example.com/.well-known/oauth-resource-server"
La cabecera proporciona:
- Identificación del ámbito del recurso
- Alcances requeridos
- Ubicación de la URL de metadatos
- Descubrimiento Directo de URI Bien Conocido:
Puedes acceder directamente a los metadatos realizando una solicitud GET al endpoint bien conocido:
GET /.well-known/oauth-resource-server HTTP/1.1
Host: api.example.com
El endpoint sigue un formato estandarizado:
- URI base:
https://api.example.com
- Ruta bien conocida:
/.well-known/oauth-resource-server
- URL completa:
https://api.example.com/.well-known/oauth-resource-server
¿Cómo funciona la cabecera WWW-Authenticate en los Metadatos de Recursos Protegidos?
La cabecera WWW-Authenticate es un componente clave en los Metadatos de Recursos Protegidos para implementar el mecanismo de descubrimiento automático. Aprovecha la cabecera estándar HTTP WWW-Authenticate
para transmitir información de metadatos, permitiendo a los clientes descubrir y configurar automáticamente los requisitos de acceso para los servidores de recursos.
Cuando un cliente intenta acceder por primera vez a un recurso protegido sin proporcionar un access token, el servidor de recursos responde con un código de estado 401 Unauthorized e incluye una cabecera WWW-Authenticate:
WWW-Authenticate: Bearer realm="example",
scope="read write",
resource_metadata_url="https://api.example.com/.well-known/oauth-resource-server"
Esta cabecera puede contener varias piezas clave de información:
Bearer
: Indica que este es un esquema de autenticación de OAuth 2.0 Bearer Tokenrealm
: Define el espacio de protección del recursoscope
: Especifica los permisos de acceso requeridosresource_metadata_url
: Apunta a la ubicación del documento de metadatos que contiene la configuración completa del servidor de recursos
Al recibir esta cabecera, el cliente extrae el resource_metadata_url
y recupera el documento de metadatos completo desde esa URL.
Basado en la información de metadatos obtenida, el cliente puede determinar los servidores de autorización apropiados, los formatos de token soportados, los alcances disponibles y otros detalles de configuración para configurar adecuadamente las solicitudes de autenticación.
¿Cómo asegurar los Metadatos de Recursos Protegidos de OAuth 2.0?
Las consideraciones de seguridad esenciales incluyen:
-
Seguridad de Transporte:
- Uso obligatorio de TLS
- Validación de certificados
- Manejo seguro de conexiones
-
Integridad de Metadatos:
- Validación de la fuente
- Verificación de firmas
- Estrategias de almacenamiento en caché seguras
-
Control de Acceso:
- Limitación de tasa
- Validación de solicitudes
- Monitoreo de abuso
¿Cómo implementar los Metadatos de Recursos Protegidos de OAuth 2.0?
Así es como se implementan los Metadatos de Recursos Protegidos de OAuth 2.0 en diferentes componentes:
- Implementación del Resource Server
El servidor de recursos responde con un estado 401 Unauthorized e incluye la URL de metadatos en la cabecera WWW-Authenticate cuando recibe un intento de acceso no autorizado:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="example",
resource_metadata_url="https://api.example.com/.well-known/oauth-resource-server"
- Implementación del Cliente
El cliente implementa una función asíncrona para manejar el acceso a recursos. Al recibir una respuesta 401, esta función extrae la URL de metadatos de la cabecera WWW-Authenticate, obtiene los metadatos y los utiliza para la configuración del cliente:
async function handleResourceAccess(response) {
if (response.status === 401) {
const wwwAuthenticate = response.headers.get('WWW-Authenticate');
const metadataUrl = extractMetadataUrl(wwwAuthenticate);
const metadata = await fetchMetadata(metadataUrl);
// Configuración del cliente basada en metadatos
}
}
- Estructura del Documento de Metadatos
El servidor de recursos proporciona un documento de metadatos como un objeto JSON que contiene:
- Identificador del recurso
- Lista de servidores de autorización autorizados
- Alcances soportados
- Formatos de token soportados
- Algoritmos de firma DPoP soportados
Aquí hay un ejemplo del documento de metadatos:
{
"resource": "https://api.example.com",
"authorization_servers": ["https://auth.example.com"],
"scopes_supported": ["read", "write"],
"token_formats_supported": ["jwt"],
"dpop_signing_alg_values_supported": ["ES256"]
}
Estos componentes trabajan juntos para formar una implementación completa de Metadatos de Recursos Protegidos de OAuth 2.0. A través de esta implementación, los clientes pueden descubrir y configurar automáticamente los parámetros necesarios para acceder a recursos protegidos.