# Cloudflare R2: bucket, CORS và phân phối Tạo bucket R2, cấu hình CORS cho tải lên và phát, kết nối miền tùy chỉnh hoặc URL thử nghiệm r2.dev, rồi xác minh tải lên qua DRM-X 6.0. Video đã mã hóa và giấy phép DRM được truyền qua các đường riêng CDN phân phối video đã mã hóa. Backend kiểm tra quyền truy cập, còn dịch vụ giấy phép DRM cho phép giải mã trên thiết bị tương thích. - 01**Lưu trữ / CDN** Phân phối nội dung đã mã hóa đến trình phát. - 02**Backend của bạn** Kiểm tra quyền xem và yêu cầu thông tin cấp quyền phát từ DRM-X. - 03**DRM-X** Xác thực thông tin cấp quyền phát và xử lý yêu cầu giấy phép DRM. - 04**Trình phát + thiết bị** Dùng hệ thống DRM của thiết bị để nhận giấy phép và phát nội dung đã mã hóa. Backend của bạn quyết định quyền truy cập; DRM-X thực thi chính sách đã ký. Nội dung đã mã hóa và giấy phép DRM được phân phối qua các đường riêng. **Từ bucket mới đến tải lên đang hoạt động** Tạo bucket R2, định cấu hình trình duyệt CORS, chọn phân phối HTTPS công khai URL, kết nối DRM-X, đồng thời tải lên và truy xuất đối tượng thử nghiệm. Giữ các video gốc và tài liệu riêng tư bên ngoài bucket phân phối này. Chỉ xuất bản phương tiện được mã hóa và tài sản công cộng dự định. Phân phối công khai giúp các byte đối tượng có thể truy cập được bằng URL; DRM kiểm soát việc giải mã phương tiện được đóng gói chính xác. CORS là quy tắc tương thích với trình duyệt, không phải quy tắc ủy quyền. Những ảnh chụp màn hình bảng điều khiển thực này không bao gồm tiêu đề tài khoản và thông tin nhận dạng cá nhân. Từ ngữ trong menu có thể thay đổi. ## 1. Tạo bucket R2 của bạn[#](#create-bucket) - Đăng nhập vào Cloudflare và chọn tài khoản sẽ sở hữu bucket. - Mở **Storage & databases → R2 Object Storage → Overview → Create bucket**. - Nhập tên bucket duy nhất, chẳng hạn như `customer-drm-media-example`. Chọn một địa điểm hoặc khu vực pháp lý thích hợp. Sử dụng bộ lưu trữ **Standard** cho hướng dẫn này, sau đó tạo bucket. - Mở **Settings** của bucket. Ghi lại tên bucket, Cloudflare account ID và endpoint **General → S3 API**. Với khu vực pháp lý mặc định, endpoint API là `https://.r2.cloudflarestorage.com`. Nếu Cloudflare hiển thị hostname riêng cho khu vực pháp lý, dùng chính xác hostname đó. Xóa `/bucket-name` ở cuối khi nhập endpoint vào DRM-X; tên bucket có trường riêng. Endpoint API này không phải URL phát công khai. ## 2. Tạo thông tin xác thực chỉ có quyền truy cập bucket này[#](#create-credentials) - Quay lại R2 Overview và mở **Manage API tokens**. Chọn mã thông báo tài khoản R2 hoặc mã thông báo người dùng nếu tổ chức của bạn yêu cầu. - Chọn **Create API token**, đặt cho nó một cái tên dễ nhận biết và chọn **Object Read & Write**. - Chọn **Apply to specific buckets only** và chọn bucket này. Định cấu hình hết hạn theo chính sách của bạn. Đối với hướng dẫn này, hãy không đặt bộ lọc IP tùy chọn. Nếu chính sách bảo mật của bạn yêu cầu điều đó, hãy xác thực cả quyền truy cập máy chủ DRM-X và tải lên trực tiếp từ mạng trình duyệt của khách hàng. - Tạo mã thông báo và ghi lại **Access Key ID** và **Secret Access Key** cho DRM-X một cách an toàn. **Dùng cặp thông tin xác thực S3** Cloudflare Token value riêng không phải S3 Secret Access Key. DRM-X không cần token quản trị toàn tài khoản. Hãy tự quản lý CORS và miền trong Cloudflare. ## 3. Chọn URL phân phối công khai[#](#public-delivery) ![R2 Settings: Thêm dưới Custom Domains hoặc Bật dưới Public Development URL.](https://docs.drm-x.com/assets/storage/r2-delivery.png)12**1 — Môi trường thực tế:** Thêm miền tùy chỉnh. **2 — Thử nghiệm:** Bật Public Development URL. ### Tùy chọn A: kết nối miền của bạn để sản xuất - Có một miền đã hoàn tất quá trình thiết lập DNS trong cùng một tài khoản Cloudflare. Chọn tên miền phụ như `media.example.com`. - Trong bucket, mở **Settings → Custom Domains → Add**. Nhập miền phụ, xem lại thay đổi DNS và kết nối bằng quy trình R2 này. - Đợi miền và chứng chỉ HTTPS hoạt động. Nguồn gốc phân phối của bạn là `https://media.example.com`. Không tạo CNAME trỏ đến địa chỉ r2.dev. Sử dụng quy trình làm việc R2 của Custom Domains. Quá trình phát triển URL có thể bị vô hiệu hóa khi miền tùy chỉnh được kết nối. ### Tùy chọn B: bật Cloudflare's URL để thử nghiệm - Mở **Settings → Public Development URL → Enable**. - Xem lại thông báo truy cập công cộng, nhập `allow` khi được yêu cầu và xác nhận. - Sao chép `https://pub-….r2.dev` URL thực tế được hiển thị bởi Cloudflare. Không xây dựng nó từ tài khoản ID hoặc tên bucket của bạn. Điểm cuối r2.dev bị giới hạn tỷ lệ và dành cho phát triển. Sử dụng miền tùy chỉnh cho các tính năng sản xuất, bộ nhớ đệm và Cloudflare bảo mật. ## 4. Cấu hình CORS cho tải lên và phát trên trình duyệt[#](#configure-cors) ![R2 CORS Policy bảng chỉnh sửa, nguồn gốc, phương thức và tiêu đề được phép.](https://docs.drm-x.com/assets/storage/r2-cors.png)12**1:** chọn Add CORS policy cho bucket mới hoặc Chỉnh sửa. **2:** xác nhận nguồn gốc, phương thức và tiêu đề đã lưu. Ảnh chụp màn hình này hiển thị quy tắc chẩn đoán chỉ Console; sử dụng ví dụ hai quy tắc hoàn chỉnh bên dưới cho trang web trình phát của bạn. - Mở **Settings → CORS Policy → Add CORS policy** hoặc **Edit**. - Dán JSON bên dưới vào trình chỉnh sửa. Thay thế `https://www.example.com` bằng nguồn gốc của trang web nhúng trình phát của bạn. Nguồn gốc bao gồm HTTPS và tên máy chủ nhưng không có đường dẫn trang như /watch. - Giữ nguyên các quy tắc bắt buộc khác nếu bucket đã có chính sách, sau đó chọn **Save**. - Chờ thay đổi được áp dụng rồi thử tải lên lại. Nếu miền tùy chỉnh còn lưu header CORS cũ trong cache, hãy xóa phản hồi cache tại các đường dẫn bị ảnh hưởng và kiểm tra lại. ``` [ { "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 } ] ``` Quy tắc đầu tiên cho phép tải lên PUT có chữ ký từ DRM-X Console. Thứ hai cho phép GET/HEAD từ trang web trình phát của bạn và DRM-X trang thử nghiệm. R2 miền tùy chỉnh sử dụng chính sách CORS của bucket. CORS không cấp quyền truy cập tải lên ẩn danh. ### Tạo các trường CORS của bạn và các trường URL phù hợp Công cụ này chạy trong trình duyệt của bạn. Chỉ nhập nguồn gốc công khai; nó không yêu cầu khóa truy cập. Nguồn gốc trang web của trình phátThay thế ví dụ. Phân tách nhiều nguồn gốc HTTPS bằng dấu cách hoặc dấu phẩy. Sử dụng trang web nhúng trình phát của bạn mà không cần đường dẫn trang. DRM-X Console và Playback Lab được tự động đưa vào.Origin phân phối công khaiNhập miền tùy chỉnh được kết nối của bạn, đã bật r2.dev URL hoặc CloudFront nguồn gốc. Bỏ qua thư mục ở đây.Thư mục lưu trữ (tùy chọn)Tạo cấu hình Sao chép CORS JSON ``` ``` Protected-content base path``Public URL prefix``Ví dụ về khóa đối tượng``Ví dụ URL đầy đủ`` ## 5. Kết nối R2 trong DRM-X 6.0[#](#connect-drmx) Mở [Cloud Storage → Connect storage](https://6.drm-x.com/console/cloud-storage) và chọn **Cloudflare R2**. | Tìm kiếm | Nhập gì | | --- | --- | | Display name | Tên dễ nhận biết, chẳng hạn Production R2. | | Bucket name | Tên bucket chính xác, không có URL hoặc thư mục. | | Cloudflare account ID | ID của tài khoản sở hữu bucket này. | | S3 API endpoint | Để trống đối với phạm vi quyền hạn mặc định hoặc nhập điểm cuối tài khoản/quyền tài phán mà không có đường dẫn bucket. | | Protected-content base path | `protected` hoặc để trống đối với các bản tải lên gốc bucket. | | Public URL prefix | `https://media.example.com/protected` hoặc bạn đã bật `https://pub-….r2.dev/protected` URL. | | Access key ID / Secret access key | Cặp thông tin xác thực S3 từ bước 2. | Các ví dụ sử dụng thư mục có tên `protected`. Tên bucket không tự động là một thư mục. Với ánh xạ miền trực tiếp đến bucket được sử dụng ở đây, hãy bao gồm cùng một thư mục lưu trữ chính xác một lần trong tiền tố URL công khai. ``` 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 ``` Để sử dụng bucket gốc, hãy để trống đường dẫn cơ sở và chỉ nhập nguồn gốc phân phối làm tiền tố công khai. Không thêm tên bucket trừ khi bạn cố tình sử dụng nó làm thư mục. Để trống CloudFront Origin path cho ánh xạ này. Chọn **Sử dụng làm mặc định CLI đích tải lên** nếu muốn. Chọn **Save and verify**. Thông tin xác thực được mã hóa ở trạng thái lưu trữ và không được trả lại sau khi lưu. Tiếp tục thử nghiệm tải lên thực sự ngay cả khi xác minh thành công. ## 6. Tải lên một tệp và xác minh rằng nó hoạt động[#](#test-upload) - Mở [Cloud Storage](https://6.drm-x.com/console/cloud-storage), chọn điểm đến này và chọn **Verify location**. Thành công có nghĩa là máy chủ DRM-X có thể liệt kê bucket. Nó không thiết lập quyền ghi, trình duyệt CORS hoặc phân phối công khai. - Chọn **Upload encrypted files** và chọn một phân đoạn nhỏ được mã hóa từ gói DRM-X hiện có. Nếu bạn không có gói, hãy sử dụng chẩn đoán được mã hóa dùng một lần bên dưới. Không tải lên video gốc hoặc tài liệu cá nhân. - Chờ thông báo thành công. Kiểm tra xem tên tệp và kích thước có xuất hiện trong Cloud Storage hay không. Tìm đối tượng tương tự trong `protected/` trong bảng điều khiển nhà cung cấp của bạn. - Nhấp vào **Preview URL** và kiểm tra cùng đối tượng đó trong cửa sổ trình duyệt riêng tư. Nó sẽ tải xuống hoặc trả về HTTP 200 mà không cần đăng nhập AWS hoặc Cloudflare. Kiểm tra đối tượng thực tế: gốc của miền có thể trả về 403/404 ngay cả khi quá trình phân phối đối tượng hoạt động. - Kiểm tra truy cập cross-origin từ trang web đặt trình phát. Bảng Network trong trình duyệt phải hiển thị `Access-Control-Allow-Origin` khớp với Origin của trang trình phát. Tải trực tiếp từ thanh địa chỉ không kiểm tra CORS. Ví dụ terminal bên dưới cũng kiểm tra header. - Chỉ xóa đối tượng chẩn đoán dùng một lần của bạn khi hoàn tất. Sau đó làm theo hướng dẫn [Desktop Packager](https://docs.drm-x.com/vi/packaging/desktop), chọn đích lưu trữ này trong Package content và tải gói mã hóa hoàn chỉnh lên. Tải tệp lên theo cách thủ công không đăng ký Published Content ID. - Kiểm tra tệp Published thu được trong [Universal Playback Lab](https://multi-drm.drm-x.com/vi/player) và trang web trình phát của riêng bạn. Xác minh video, âm thanh, tua trên thanh thời gian và các thiết bị cần thiết của bạn. Tải xuống nhị phân thành công không phải là bằng chứng cho việc phát lại DRM. Không có mẫu mã hóa? Tạo tệp thử nghiệm dùng một lần trên Windows Chạy cái này trong Windows PowerShell trong thư mục tạm thời mà bạn kiểm soát. Nó mã hóa một tin nhắn ngắn không mang tính cá nhân bằng khóa AES dùng một lần chỉ được giữ trong bộ nhớ. Đầu ra là chẩn đoán lưu trữ, không phải phương tiện có thể phát được; nó không chứa DRM khóa nội dung hoặc dữ liệu khách hàng. ``` $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 ``` Tải lên `drmx-storage-check.encrypted.bin`, xác minh kích thước của nó và Preview URL, sau đó xóa nó khỏi bucket. ``` curl.exe -I -H "Origin: https://www.example.com" "https://media.example.com/protected/sample.encrypted.bin" ``` Thay cả hai URL. Phản hồi phải là HTTP 200 với Origin được phép khớp trang web đặt trình phát. Với truy cập theo byte range, yêu cầu GET chứa `Range: bytes=0-15` phải trả về HTTP 206 và header Content-Range hợp lệ. Giữ đúng MIME type: manifest DASH dùng application/dash+xml, playlist HLS dùng application/vnd.apple.mpegurl, còn tệp media dùng loại tương ứng. ## 7. Khắc phục sự cố[#](#troubleshooting) | Kết quả | Hành động | | --- | --- | | Verify location thành công nhưng tải lên từ trình duyệt thất bại | Kiểm tra bảng Console và Network của trình duyệt. Cho phép PUT qua CORS từ đúng Origin của Console và cho phép header Content-Type. Kiểm tra kết nối, rồi thử lại để nhận presigned URL mới. | | Tải lên trả về 403 | Kiểm tra quyền ghi đối tượng, phạm vi bucket/thư mục, điểm cuối, vùng, hết hạn yêu cầu và đồng hồ. Không chia sẻ URL tải lên đã ký. | | Tải lên thành công; công khai URL trả về 403 | Kiểm tra xem phân phối công khai có được bật hay không và miền/phân phối đã triển khai xong hay chưa. | | Công khai URL trả về 404 | So sánh URL đầy đủ với object key chính xác. Kiểm tra thư mục bị thiếu hoặc lặp, đồng thời kiểm tra chữ hoa/chữ thường trong tên tệp. | | URL trực tiếp mở ra; tìm nạp trình phát không thành công | Thêm nguồn gốc trang trình phát vào GET/HEAD CORS. Kiểm tra tiêu đề phản hồi CDN và vô hiệu hóa các phản hồi đã lưu trong bộ nhớ đệm cũ bị ảnh hưởng. | | Tải xuống thành công; phát lại không thành công | Kiểm tra việc xuất bản gói, đường dẫn kê khai, loại MIME và ủy quyền giấy phép DRM. Xem phần [khắc phục sự cố phát lại](https://docs.drm-x.com/vi/troubleshooting/playback). | ## Tài liệu tham khảo chính thức[#](#references) - [Tạo một bucket R2](https://developers.cloudflare.com/r2/buckets/create-buckets/) - [R2 thông tin xác thực và quyền](https://developers.cloudflare.com/r2/api/tokens/) - [Miền tùy chỉnh và r2.dev](https://developers.cloudflare.com/r2/buckets/public-buckets/) - [R2 CORS và hoạt động của bộ nhớ đệm](https://developers.cloudflare.com/r2/buckets/cors/) Sử dụng AWS? Theo dõi [Amazon S3 và CloudFront thiết lập](https://docs.drm-x.com/vi/storage/amazon-s3).