# Cloudflare R2: bucket, CORS y distribución Cree un bucket R2, configure CORS para cargas y reproducción, conecte un dominio personalizado o una URL de prueba r2.dev y compruebe una carga con DRM-X 6.0. El vídeo cifrado y las licencias DRM se entregan por rutas distintas La CDN entrega el vídeo cifrado. Su backend comprueba el acceso y el servicio de licencias DRM autoriza el descifrado en un dispositivo compatible. - 01**Almacenamiento / CDN** Entrega el contenido cifrado al reproductor. - 02**Su backend** Comprueba si el espectador tiene permiso y solicita la autorización de reproducción a DRM-X. - 03**DRM-X** Valida la autorización de reproducción y procesa la solicitud de licencia DRM. - 04**Reproductor + dispositivo** Utiliza el sistema DRM del dispositivo para obtener una licencia y reproducir el contenido cifrado. Su backend decide el acceso; DRM-X aplica la política firmada. Los medios cifrados y las licencias DRM siguen caminos de entrega separados. **De un depósito nuevo a una carga funcional** Cree un depósito R2, configure el navegador CORS, elija una entrega HTTPS pública URL, conéctese DRM-X y cargue y recupere un objeto de prueba. Mantenga los vídeos originales y los documentos privados fuera de este depósito de entrega. Publique únicamente medios cifrados y activos públicos previstos. La entrega pública hace que los bytes del objeto sean accesibles en URL; DRM controla el descifrado de medios empaquetados correctamente. CORS es una regla de compatibilidad del navegador, no una autorización. Estas capturas de pantalla reales de la consola excluyen los encabezados de cuenta y los identificadores personales. La redacción del menú puede cambiar. ## 1. Crea tu depósito R2[#](#create-bucket) - Inicie sesión en Cloudflare y elija la cuenta que será propietaria del depósito. - Abrir **Storage & databases → R2 Object Storage → Overview → Create bucket**. - Ingrese un nombre de depósito único, como `customer-drm-media-example`. Seleccione una ubicación o jurisdicción adecuada. Utilice el almacenamiento **Standard** para este tutorial y luego cree el depósito. - Abra **Settings** del bucket. Anote su nombre, el Cloudflare account ID y el endpoint de **General → S3 API**. Para la jurisdicción predeterminada, el punto final API es `https://.r2.cloudflarestorage.com`. Si Cloudflare muestra un nombre de host específico de una jurisdicción, use ese nombre de host exacto. Elimine un `/bucket-name` final al ingresar el punto final en DRM-X; el nombre del depósito tiene su propio campo. Este punto final API no es una reproducción pública URL. ## 2. Crear credenciales limitadas a este bucket[#](#create-credentials) - Regrese a R2 Overview y abra **Manage API tokens**. Elija un token de cuenta R2 o un token de usuario si su organización lo requiere. - Seleccione **Create API token**, asígnele un nombre reconocible y elija **Object Read & Write**. - Elija **Apply to specific buckets only** y seleccione este depósito. Configure el vencimiento según su póliza. Para este tutorial, deje el filtrado opcional IP sin configurar. Si su política de seguridad lo requiere, valide tanto el acceso al servidor DRM-X como las cargas directas desde las redes de navegadores del cliente. - Cree el token y registre de forma segura el **Access Key ID** y el **Secret Access Key** para DRM-X. **Utilice el S3 par de credenciales** El Cloudflare Token value separado no es el S3 Secret Access Key. DRM-X no necesita un token administrativo para toda la cuenta. Administre CORS y dominios usted mismo en Cloudflare. ## 3. Elegir una URL de distribución pública[#](#public-delivery) ![R2 Settings: Agregar en Custom Domains o Habilitar en Public Development URL.](https://docs.drm-x.com/assets/storage/r2-delivery.png)12**1 — Producción:** Agregar un dominio personalizado. **2 — Pruebas:** Habilitar el desarrollo público URL. ### Opción A: conecta tu dominio para producción - Tener un dominio con su configuración DNS completada en la misma cuenta Cloudflare. Elija un subdominio como `media.example.com`. - En el bucket, abra **Settings → Custom Domains → Add**. Introduzca el subdominio, revise el cambio DNS y conéctelo mediante este flujo de R2. - Espere a que el dominio y el certificado HTTPS se activen. Su origen de entrega es `https://media.example.com`. No cree un CNAME que apunte a una dirección r2.dev. Utilice el flujo de trabajo Custom Domains de R2. El desarrollo URL puede permanecer deshabilitado cuando se conecta un dominio personalizado. ### Opción B: habilitar Cloudflare's URL para pruebas - Abra **Settings → Public Development URL → Enable**. - Revise el aviso de acceso público, escriba `allow` cuando se le solicite y confirme. - Copie el `https://pub-….r2.dev` URL real mostrado por Cloudflare. No lo construyas desde tu cuenta ID o el nombre del depósito. El punto final r2.dev tiene una velocidad limitada y está diseñado para desarrollo. Utilice un dominio personalizado para producción, almacenamiento en caché y Cloudflare funciones de seguridad. ## 4. Configurar CORS para las cargas y la reproducción en el navegador[#](#configure-cors) ![R2 CORS Policy panel con Editar, orígenes permitidos, métodos y encabezados.](https://docs.drm-x.com/assets/storage/r2-cors.png)12**1:** elija Add CORS policy para un nuevo depósito o Editar. **2:** confirme el origen, los métodos y los encabezados guardados. Esta captura de pantalla muestra una regla de diagnóstico de solo Console; Utilice el ejemplo completo de dos reglas que aparece a continuación para los sitios web de sus reproductores. - Abra **Settings → CORS Policy → Add CORS policy** o **Edit**. - Pegue el JSON a continuación en el editor. Reemplace `https://www.example.com` con el origen del sitio web que integra su reproductor. Un origen incluye HTTPS y el nombre de host, pero no incluye una ruta de página como /watch. - Conserve las demás reglas necesarias si el bucket ya tiene una política y seleccione **Save**. - Espere a que se propague el cambio y vuelva a intentar la carga. Si el dominio personalizado conserva encabezados CORS antiguos en caché, purgue las respuestas en caché de las rutas afectadas y repita la prueba. ``` [ { "AllowedOrigins": [ "https://6.drm-x.com" ], "AllowedMethods": [ "PUT" ], "AllowedHeaders": [ "Content-Type", "x-amz-meta-drmx-sha256" ], "ExposeHeaders": [ "ETag" ], "MaxAgeSeconds": 3600 }, { "AllowedOrigins": [ "https://6.drm-x.com", "https://multi-drm.drm-x.com", "https://www.example.com" ], "AllowedMethods": [ "GET", "HEAD" ], "AllowedHeaders": [ "Range" ], "ExposeHeaders": [ "ETag", "Content-Length", "Content-Range", "Accept-Ranges" ], "MaxAgeSeconds": 3600 } ] ``` La primera regla permite cargas firmadas de PUT desde DRM-X Console. El segundo permite GET/HEAD desde el sitio web de su reproductor y DRM-X páginas de prueba. R2 los dominios personalizados utilizan la política CORS del depósito. CORS no otorga acceso de carga anónimo. ### Genera tus campos CORS y URL coincidentes Esta herramienta se ejecuta en su navegador. Introduzca únicamente orígenes públicos; No solicita claves de acceso. Orígenes de los sitios web del reproductorReemplace el ejemplo. Separe varios orígenes HTTPS con espacios o comas. Utilice el sitio web que incorpora su reproductor, sin una ruta de página. DRM-X Console y Playback Lab se incluyen automáticamente.Origen de entrega públicaIngrese su dominio personalizado conectado, habilitado r2.dev URL o CloudFront origen. Omita la carpeta aquí.Carpeta de almacenamiento (opcional)Generar configuración Copiar CORS JSON ``` ``` Protected-content base path``Public URL prefix``Ejemplo de clave de objeto``Ejemplo de URL completa`` ## 5. Conecte R2 en DRM-X 6.0[#](#connect-drmx) Abra [Cloud Storage → Connect storage](https://6.drm-x.com/console/cloud-storage) y elija **Cloudflare R2**. | Campo | Qué ingresar | | --- | --- | | Display name | Una etiqueta amigable, como Producción R2. | | Bucket name | El nombre exacto del depósito, sin URL ni carpeta. | | Cloudflare account ID | El ID de la cuenta propietaria de este depósito. | | S3 API endpoint | Déjelo en blanco para la jurisdicción predeterminada o ingrese el punto final de la cuenta/jurisdicción sin la ruta del depósito. | | Protected-content base path | `protected`, o en blanco para cargas desde la raíz del depósito. | | Public URL prefix | `https://media.example.com/protected` o tu habilitado `https://pub-….r2.dev/protected` URL. | | Access key ID / Secret access key | El par de credenciales S3 del paso 2. | Los ejemplos utilizan una carpeta llamada `protected`. El nombre del depósito no es automáticamente una carpeta. Con la asignación directa de dominio a depósito que se utiliza aquí, incluya la misma carpeta de almacenamiento exactamente una vez en el prefijo público URL. ``` Bucket: customer-drm-media-example Protected-content base path: protected Public URL prefix: https://media.example.com/protected File selected for upload: sample.encrypted.bin Object key in the bucket: protected/sample.encrypted.bin Preview URL: https://media.example.com/protected/sample.encrypted.bin ``` Para usar la raíz del depósito, deje la ruta base en blanco e ingrese solo el origen de entrega como prefijo público. No agregues un nombre de depósito a menos que lo uses deliberadamente como carpeta. Deje CloudFront Origin path vacío para este mapeo. Elija **Usar como predeterminado CLI destino de carga** si lo desea. Seleccione **Save and verify**. Las credenciales se cifran en reposo y no se devuelven después de guardarlas. Continúe con la prueba de carga real incluso si la verificación es exitosa. ## 6. Cargar un archivo y verificar que funcione[#](#test-upload) - Abra [Cloud Storage](https://6.drm-x.com/console/cloud-storage), seleccione este destino y elija **Verify location**. El éxito significa que el servidor DRM-X puede enumerar el depósito. No establece permiso de escritura, navegador CORS ni entrega pública. - Seleccione **Upload encrypted files** y elija un pequeño segmento cifrado de un paquete DRM-X existente. Si no tiene un paquete, utilice el diagnóstico cifrado desechable a continuación. No subas un vídeo original o un documento personal. - Espere el mensaje de éxito. Comprueba que el nombre del archivo y el tamaño aparecen en Cloud Storage. Busque el mismo objeto en `protected/` en la consola de su proveedor. - Haga clic en **Preview URL** y pruebe ese mismo objeto en una ventana privada del navegador. Debería descargar o devolver HTTP 200 sin iniciar sesión AWS o Cloudflare. Pruebe un objeto real: la raíz de un dominio puede devolver 403/404 incluso cuando la entrega del objeto funciona. - Verifique la entrega entre orígenes desde el sitio web de su reproductor. El panel de red de su navegador debería mostrar `Access-Control-Allow-Origin` que coincida con el origen de la página del reproductor. Una descarga directa desde la barra de direcciones no prueba CORS. El siguiente ejemplo de terminal también verifica los encabezados. - Retire solo su objeto de diagnóstico desechable cuando haya terminado. Luego siga la [Guía de Desktop Packager](https://docs.drm-x.com/es/packaging/desktop), seleccione este destino de almacenamiento en Package content y cargue el paquete cifrado completo. Cargar un archivo manualmente no registra un Published Content ID. - Pruebe el archivo Published resultante en [Universal Playback Lab](https://multi-drm.drm-x.com/es/player) y en el sitio web de su propio reproductor. Verifique video, audio, desplazamiento en la línea de tiempo y sus dispositivos requeridos. Una descarga binaria exitosa no es prueba de reproducción de DRM. ¿No hay muestra cifrada? Cree un archivo de prueba desechable en Windows Ejecute esto en Windows PowerShell en una carpeta temporal que controle. Cifra un mensaje breve no personal con una clave AES de un solo uso que se guarda únicamente en la memoria. El resultado es un diagnóstico de almacenamiento, no un medio reproducible; no contiene ninguna DRM clave de contenido ni datos del cliente. ``` $samplePath = Join-Path (Get-Location) 'drmx-storage-check.encrypted.bin' if (Test-Path -LiteralPath $samplePath) { throw 'Choose a new folder; this test file already exists.' } $aes = [System.Security.Cryptography.Aes]::Create() try { $aes.GenerateKey() $aes.GenerateIV() $encryptor = $aes.CreateEncryptor() try { $bytes = [Text.Encoding]::UTF8.GetBytes('DRM-X disposable storage check') $encrypted = $encryptor.TransformFinalBlock($bytes, 0, $bytes.Length) [IO.File]::WriteAllBytes($samplePath, $encrypted) } finally { $encryptor.Dispose() } } finally { $aes.Dispose() } Get-Item -LiteralPath $samplePath | Select-Object Name, Length ``` Cargue `drmx-storage-check.encrypted.bin`, verifique su tamaño y Preview URL, luego retírelo del depósito. ``` curl.exe -I -H "Origin: https://www.example.com" "https://media.example.com/protected/sample.encrypted.bin" ``` Reemplace ambas URL. Espere HTTP 200 y un origen permitido que coincida con el sitio web de su reproductor. Para la entrega de rango, una solicitud GET con `Range: bytes=0-15` debe devolver HTTP 206 y un encabezado Content-Range válido. Conserve los tipos de medios MIME: los manifiestos DASH usan application/dash+xml, las listas de reproducción HLS usan application/vnd.apple.mpegurl y los archivos multimedia deben usar su tipo de medio apropiado. ## 7. Resolver problemas[#](#troubleshooting) | Resultado | Acción | | --- | --- | | Verify location pasa, pero falla la carga desde el navegador | Inspeccionar el navegador Console y los paneles de Red. Permita PUT CORS desde el origen exacto Console y Content-Type. También verifique la conectividad y vuelva a intentarlo para obtener un URL prefirmado nuevo. | | La carga devuelve 403 | Verifique el permiso de escritura del objeto, el alcance del depósito/carpeta, el punto final, la región, la caducidad de la solicitud y el reloj. No comparta URL de carga firmadas. | | La carga se realizó correctamente; público URL devuelve 403 | Verifique si la entrega pública está habilitada y si el dominio/distribución ha terminado de implementarse. | | Público URL devuelve 404 | Compare la URL completa con la clave exacta del objeto. Compruebe si faltan o se duplican carpetas y respete las mayúsculas y minúsculas del nombre de archivo. | | URL abre directamente; la recuperación del reproductor falla | Agregue el origen de la página del reproductor a GET/HEAD CORS. Verifique los encabezados de respuesta CDN e invalide las respuestas almacenadas en caché obsoletas afectadas. | | La descarga se realizó correctamente; la reproducción falla | Verifique la publicación del paquete, las rutas del manifiesto, los MIME tipos y la DRM autorización de licencia. Consulte [solución de problemas de reproducción](https://docs.drm-x.com/es/troubleshooting/playback). | ## Referencias oficiales[#](#references) - [Crear un R2 depósito](https://developers.cloudflare.com/r2/buckets/create-buckets/) - [R2 credenciales y permisos](https://developers.cloudflare.com/r2/api/tokens/) - [Dominios personalizados y r2.dev](https://developers.cloudflare.com/r2/buckets/public-buckets/) - [R2 CORS y comportamiento de caché](https://developers.cloudflare.com/r2/buckets/cors/) ¿Usando AWS? Siga [Amazon S3 y CloudFront configuración](https://docs.drm-x.com/es/storage/amazon-s3).