# Cloudflare R2 : bucket, CORS et diffusion Créez un bucket R2, configurez CORS pour l’envoi et la lecture, connectez un domaine personnalisé ou une URL de test r2.dev, puis vérifiez un envoi avec DRM-X 6.0. La vidéo chiffrée et les licences DRM suivent des chemins distincts Le CDN distribue la vidéo chiffrée. Votre backend vérifie l’accès, et le service de licences DRM autorise le déchiffrement sur un appareil compatible. - 01**Stockage / CDN** Distribue les médias chiffrés au lecteur. - 02**Votre backend** Vérifie le droit de visionnage et demande l’autorisation de lecture à DRM-X. - 03**DRM-X** Valide l’autorisation de lecture et traite la demande de licence DRM. - 04**Lecteur + appareil** Utilise le système DRM de l’appareil pour obtenir une licence et lire les médias chiffrés. Votre moteur décide de l'accès; DRM-X applique la politique signée. Les licences de médias chiffrés et DRM suivent des chemins de livraison séparés. **Du nouveau bucket au premier envoi réussi** Créez un bucket R2, configurez CORS, choisissez une URL publique de diffusion HTTPS, connectez DRM-X, puis envoyez et récupérez un objet de test. Gardez vos vidéos originales et documents privés hors de ce bucket de diffusion. Publiez uniquement des médias chiffrés et des ressources destinées au public. La diffusion publique rend les octets d'objet accessibles par URL ; DRM contrôle le déchiffrement des médias correctement préparés et chiffrés. CORS est une règle de compatibilité du navigateur, pas une autorisation. Ces captures d'écran de la console réelle excluent les en-têtes de compte et les identifiants personnels. La formulation du menu peut changer. ## 1. Créez votre bucket R2[#](#create-bucket) - Connectez-vous à Cloudflare et choisissez le compte qui sera propriétaire du bucket. - Ouvrez **Storage & databases → R2 Object Storage → Overview → Create bucket**. - Entrez un nom de bucket unique, tel que `customer-drm-media-example`. Sélectionnez un emplacement ou une juridiction appropriée. Utilisez le stockage **Standard** pour cette procédure pas à pas, puis créez le bucket. - Ouvrez **Settings** dans le bucket. Notez son nom, le Cloudflare account ID et le point de terminaison **General → S3 API**. Pour la juridiction par défaut, le point de terminaison API est `https://.r2.cloudflarestorage.com`. Si Cloudflare affiche un nom d'hôte spécifique à une juridiction, utilisez ce nom d'hôte exact. Supprimez un `/bucket-name` final lors de la saisie du point de terminaison dans DRM-X ; le nom du bucket a son propre champ. Ce point de terminaison API n'est pas une lecture publique URL. ## 2. Créez des identifiants limités à ce bucket[#](#create-credentials) - Retournez au R2 Overview et ouvrez le **Manage API tokens**. Choisissez un jeton de compte R2 ou un jeton utilisateur si votre organisation l'exige. - Sélectionnez **Create API token**, donnez-lui un nom reconnaissable et choisissez **Object Read & Write**. - Choisissez **Apply to specific buckets only** et sélectionnez ce bucket. Configurez l'expiration en fonction de votre politique. Pour cette procédure pas à pas, laissez le filtrage facultatif IP non défini. Si votre politique de sécurité l'exige, validez à la fois l'accès au serveur DRM-X et les envois directs à partir des réseaux de navigateurs des clients. - Créez le jeton et enregistrez en toute sécurité les **Access Key ID** et **Secret Access Key** pour DRM-X. **Utilisez la paire d'identifiants S3** Le ​​Cloudflare séparé Token value n'est pas le S3 Secret Access Key. DRM-X n'a pas besoin d'un jeton administratif à l'échelle du compte. Gérez vous-même CORS et vos domaines dans Cloudflare. ## 3. Choisissez votre URL de diffusion publique[#](#public-delivery) ![R2 Settings : Ajouter sous Custom Domains, ou Activer sous Public Development URL.](https://docs.drm-x.com/assets/storage/r2-delivery.png)12**1 — Production :** Ajoutez un domaine personnalisé. **2 — Tests :** Activer le développement public URL. ### Option A : connectez votre domaine pour la production - Avoir un domaine avec sa configuration DNS complétée dans le même compte Cloudflare. Choisissez un sous-domaine tel que `media.example.com`. - Dans le bucket, ouvrez **Settings → Custom Domains → Add**. Entrez le sous-domaine, examinez la modification DNS et connectez-le à l'aide de ce workflow R2. - Attendez que le domaine et le certificat HTTPS deviennent actifs. Votre origine de diffusion est le `https://media.example.com`. Ne créez pas de CNAME pointant vers une adresse r2.dev. Utilisez le flux de travail R2 de Custom Domains. Le développement URL peut rester désactivé lorsqu'un domaine personnalisé est connecté. ### Option B : activer l’URL Cloudflare pour les tests - Ouvrez **Settings → Public Development URL → Enable**. - Consultez l'avis d'accès public, tapez `allow` lorsque cela vous est demandé et confirmez. - Copiez le `https://pub-….r2.dev` URL réel affiché par Cloudflare. Ne le construisez pas à partir de votre compte ID ou du nom du bucket. Le point de terminaison r2.dev est limité en débit et destiné au développement. Utilisez un domaine personnalisé pour les fonctionnalités de production, de mise en cache et de Cloudflare sécurité. ## 4. Configurez CORS pour l’envoi et la lecture dans le navigateur[#](#configure-cors) ![R2 CORS Policy panneau avec Edition, origines autorisées, méthodes et en-têtes.](https://docs.drm-x.com/assets/storage/r2-cors.png)12**1 :** choisissez Add CORS policy pour un nouveau bucket, ou Modifier. **2 :** confirmez l'origine, les méthodes et les en-têtes enregistrés. Cette capture d'écran montre une règle de diagnostic uniquement Console ; utilisez l'exemple complet de deux règles ci-dessous pour vos sites Web de lecteurs. - Ouvrez **Settings → CORS Policy → Add CORS policy** (ou **Edit**). - Collez le JSON ci-dessous dans l'éditeur. Remplacez `https://www.example.com` par l'origine du site internet qui embarque votre lecteur. Une origine inclut HTTPS et le nom d'hôte, mais aucun chemin de page tel que /watch. - Conservez les autres règles requises si le bucket a déjà une stratégie, puis sélectionnez **Save**. - Attendez du temps pour la propagation, puis réessayez le envoi. Si les objets de domaine personnalisé ont d'anciens en-têtes CORS mis en cache, purgez les chemins concernés et testez à nouveau. ``` [ { "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 première règle autorise les envois PUT signés depuis DRM-X Console. La seconde autorise GET/HEAD depuis le site du lecteur et les pages de test DRM-X. Les domaines personnalisés R2 utilisent la politique CORS du bucket. CORS n’autorise pas les envois anonymes. ### Générez vos champs CORS et URL correspondants Cet outil s'exécute dans votre navigateur. Entrez uniquement les origines publiques ; il ne demande pas de clés d'accès. Origines des sites hébergeant le lecteurRemplacez l'exemple. Séparez plusieurs origines HTTPS par des espaces ou des virgules. Utilisez le site Web intégrant votre lecteur, sans chemin de page. DRM-X Console et Playback Lab sont inclus automatiquement.Origine de diffusion publiqueSaisissez votre domaine personnalisé connecté, votre URL r2.dev activée ou l’origine CloudFront, sans dossier.Dossier de stockage (facultatif)Générer la configuration Copier CORS JSON ``` ``` Protected-content base path``Public URL prefix``Exemple de clé d'objet``Exemple d’URL complète`` ## 5. Connectez R2 dans DRM-X 6.0[#](#connect-drmx) Ouvrez [Cloud Storage → Connect storage](https://6.drm-x.com/console/cloud-storage) et choisissez **Cloudflare R2**. | Champ | Que saisir | | --- | --- | | Display name | Un libellé explicite, par exemple Production R2. | | Bucket name | Le nom exact du bucket, sans URL ni dossier. | | Cloudflare account ID | Le ID du compte propriétaire de ce bucket. | | S3 API endpoint | Laissez vide pour la juridiction par défaut ou entrez le point de terminaison du compte/juridiction sans le chemin du bucket. | | Protected-content base path | `protected`, ou vide pour les envois à la racine du bucket. | | Public URL prefix | `https://media.example.com/protected` ou votre `https://pub-….r2.dev/protected` URL activé. | | Access key ID / Secret access key | La paire d'identifiants S3 de l'étape 2. | Les exemples utilisent un dossier appelé `protected`. Le nom du bucket n'est pas automatiquement un dossier. Avec le mappage direct domaine-bucket utilisé ici, incluez le même dossier de stockage exactement une fois dans le préfixe public 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 ``` Pour utiliser la racine du bucket, laissez le chemin de base vide et entrez uniquement l'origine de la diffusion comme préfixe public. N'ajoutez pas de nom de bucket, sauf si vous l'utilisez délibérément comme dossier. Laissez CloudFront Origin path vide pour ce mappage. Choisissez **Utiliser par défaut CLI destination de envoi** si vous le souhaitez. Sélectionnez **Save and verify**. Les informations d'identification sont chiffrées au repos et ne sont pas restituées après l'enregistrement. Continuez avec le test de envoi réel même si la vérification réussit. ## 6. Envoyez un fichier et vérifiez le résultat[#](#test-upload) - Ouvrez [Cloud Storage](https://6.drm-x.com/console/cloud-storage), sélectionnez cette destination, puis **Verify location**. Un résultat positif prouve seulement que le serveur DRM-X peut lister le bucket. Il ne valide pas les droits d’écriture, CORS dans le navigateur ni la diffusion publique. - Sélectionnez **Upload encrypted files**, puis un petit segment chiffré d’un package DRM-X existant. Si vous n’en avez pas, utilisez le fichier de diagnostic chiffré ci-dessous. N’envoyez ni vidéo originale ni document personnel. - Attendez le message de réussite. Vérifiez que le nom du fichier et sa taille apparaissent dans Cloud Storage. Recherchez le même objet sous `protected/` dans la console de votre fournisseur. - Cliquez sur **Preview URL** et testez ce même objet dans une fenêtre de navigateur privé. Il devrait télécharger ou renvoyer HTTP 200 sans connexion AWS ou Cloudflare. Testez un objet réel : la racine d'un domaine peut renvoyer 403/404 même lorsque la diffusion d'objet fonctionne. - Vérifiez les requêtes cross-origin depuis le site de votre lecteur. Le panneau Network du navigateur doit afficher `Access-Control-Allow-Origin` avec l’origine de la page du lecteur. Un téléchargement depuis la barre d’adresse ne teste pas CORS. La commande ci-dessous vérifie aussi les en-têtes. - À la fin, supprimez uniquement votre objet de diagnostic temporaire. Suivez ensuite le [guide Desktop Packager](https://docs.drm-x.com/fr/packaging/desktop), choisissez cette destination dans Package content et envoyez le package chiffré complet. Un envoi manuel de fichier ne crée pas de Published Content ID. - Testez le fichier Published résultant dans [Universal Playback Lab](https://multi-drm.drm-x.com/fr/player) et votre propre site Web de lecteur. Vérifiez la vidéo, l'audio, la navigation dans la vidéo et vos appareils requis. Un téléchargement binaire réussi ne constitue pas une preuve de lecture DRM. Aucun exemple chiffré ? Créez un fichier de test jetable sur Windows Exécutez ceci dans Windows PowerShell dans un dossier temporaire que vous contrôlez. Il crypte un court message non personnel avec une clé à usage unique AES conservée uniquement en mémoire. Le résultat est un diagnostic de stockage, et non un support lisible ; il ne contient aucune clé de contenu DRM ni aucune donnée client. ``` $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 ``` Envoyez `drmx-storage-check.encrypted.bin`, vérifiez sa taille et Preview URL, puis supprimez-le du bucket. ``` curl.exe -I -H "Origin: https://www.example.com" "https://media.example.com/protected/sample.encrypted.bin" ``` Remplacez les deux URL. Attendez-vous à HTTP 200 et à une origine autorisée correspondant au site Web de votre lecteur. Pour la diffusion par plage, une requête GET avec `Range: bytes=0-15` devrait renvoyer HTTP 206 et un en-tête Content-Range valide. Préserver les types de MIME médias : DASH les manifestes utilisent application/dash+xml, HLS les listes de lecture utilisent application/vnd.apple.mpegurl et les fichiers multimédias doivent utiliser leur type de média approprié. ## 7. Dépannez votre résultat[#](#troubleshooting) | Résultat | Action | | --- | --- | | La vérification réussit, mais l’envoi depuis le navigateur échoue | Examinez les panneaux Console et Network du navigateur. Autorisez PUT via CORS depuis l’origine exacte de Console, ainsi que Content-Type. Vérifiez aussi la connexion, puis réessayez avec une nouvelle URL présignée. | | Le envoi renvoie 403 | Vérifiez l'autorisation d'écriture de l'objet, la portée du bucket/dossier, le point de terminaison, la région, l'expiration de la demande et l'horloge. Ne partagez pas les URL de envoi signées. | | Le envoi réussit ; public URL renvoie 403 | Vérifiez si la diffusion publique est activée et si le domaine/la distribution a terminé son déploiement. | | L’URL publique renvoie 404 | Comparez le URL complet avec la clé d'objet exacte. Vérifiez les dossiers manquants ou en double et la casse du nom de fichier. | | URL s'ouvre directement ; la récupération du lecteur échoue | Ajoutez l'origine de la page du lecteur à GET/HEAD CORS. Vérifiez les en-têtes de réponse CDN et invalidez les réponses périmées mises en cache affectées. | | Le téléchargement réussit ; la lecture échoue | Vérifiez la publication du package, les chemins du manifeste, les types MIME et l'autorisation de licence DRM. Voir [dépannage de lecture](https://docs.drm-x.com/fr/troubleshooting/playback). | ## Références officielles[#](#references) - [Créer un bucket R2](https://developers.cloudflare.com/r2/buckets/create-buckets/) - [R2 informations d'identification et autorisations](https://developers.cloudflare.com/r2/api/tokens/) - [Domaines personnalisés et r2.dev](https://developers.cloudflare.com/r2/buckets/public-buckets/) - [R2 CORS et comportement du cache](https://developers.cloudflare.com/r2/buckets/cors/) Vous utilisez AWS ? Suivez [Amazon S3 et CloudFront configuration](https://docs.drm-x.com/fr/storage/amazon-s3).