lets.dj

Một cái tên và một chứng chỉ

Đây là bản dịch. Bản tiếng Anh là bản có giá trị: nếu hai bản khác nhau, hãy làm theo bản tiếng Anh. Bản dịch chỉ được cung cấp để tiện theo dõi. Đọc trang này bằng tiếng Anh

Stage là một trang HTTPS, và trình duyệt chỉ tải media từ một địa chỉ có chứng chỉ mà nó đã tin cậy sẵn. Một provider trong mạng gia đình không có cả hai: không ai lấy được chứng chỉ công khai cho 192.168.1.20. Vì vậy có hai thứ chúng tôi lưu trữ, cho bất kỳ provider nào yêu cầu.

Bạn không bắt buộc dùng chúng. Một provider có thể phát từ bất kỳ tên nào, với bất kỳ chứng chỉ nào mà trình duyệt tin cậy, và không có gì khác trong đặc tả này phụ thuộc vào hai route này. Chúng dành cho trường hợp mà một cái tên và một chứng chỉ sẽ là phần khó nhất khi viết một provider.

Một cái tên

Mỗi thư viện có một cái tên riêng trên tên miền của chúng tôi: <bridgeId>.letsdj.io, ví dụ 0123456789abcdef.letsdj.io. Bạn được cho biết nó khi ghép nối, và một lần nữa qua mỗi route bên dưới. Hãy dùng hostname nguyên như được cấp và đừng tự dựng nó.

Cái tên là một bản ghi A, và bạn cho chúng tôi biết nó nên trỏ vào đâu:

POST https://api.lets.dj/providers/address
Authorization: Bearer <sync token>
Content-Type: application/json

{ "address": "192.168.1.20" }
{
  "ok": true,
  "hostname": "0123456789abcdef.letsdj.io",
  "address": "192.168.1.20",
  "ttl": 60,
  "changed": false
}

Hãy báo địa chỉ khi bạn khởi động, và báo lại mỗi khi nó đổi, đó là điều giữ cho cái tên trỏ đúng chỗ sau khi một máy chuyển từ wifi nhà sang điểm phát sóng. changed cho biết bản ghi có phải ghi lại hay đã giữ đúng giá trị đó. Bản ghi được công bố với thời gian sống (TTL) là 60 giây.

Địa chỉ phải là IPv4, ở dạng bốn số cách nhau bằng dấu chấm, và phải là địa chỉ không thể truy cập từ internet: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, link-local (169.254.0.0/16), hoặc carrier-grade NAT (100.64.0.0/10). Bất cứ thứ gì khác đều bị từ chối. Chúng tôi sắp ghi thứ bạn gửi vào một vùng DNS công khai, và nếu không kiểm tra thì đó sẽ là một bộ phân giải có thẩm quyền miễn phí cho bất cứ thứ gì, trỏ tới bất cứ đâu. Một cái tên chỉ có thể phân giải về mạng riêng của ai đó cũng là điều làm cho vùng này an toàn để mọi người đều đọc được. Các octet có số không đứng đầu cũng bị từ chối, vì 010.0.0.1 có nghĩa khác nhau với các trình phân tích khác nhau.

  • 400 invalid_address: không phải địa chỉ IPv4 ở dạng bốn số cách nhau bằng dấu chấm.
  • 400 address_not_private: một địa chỉ hợp lệ, nhưng không thuộc dải nào ở trên.
  • 403 unknown_sync_token, và 401 missing_token.
  • 502 dns_unavailable: chưa ghi được bản ghi vào lúc này. Hãy thử lại sau ít lâu.
  • 503 dns_not_configured: bản triển khai này hoàn toàn không công bố được tên.

Một cái tên mà ba mươi ngày không nghe tin gì sẽ bị gỡ. Báo một địa chỉ, hoặc lấy chứng chỉ bên dưới, đều được tính là có tin. Một provider đang chạy lấy chứng chỉ nhiều lần mỗi ngày, và không bao giờ im lặng đến mức đó. Một provider quay lại sau một thời gian dài im lặng chỉ đơn giản là được tạo lại bản ghi.

Một hạn chế đã biết. Một số router và dịch vụ lọc DNS từ chối trả lời khi một tên công khai trỏ vào một địa chỉ riêng. Nó được gọi là DNS rebinding protection, và khi nó bật, cái tên không phân giải được với bất kỳ ai sau nó và Stage không thể liên lạc với bạn. Không có cách khắc phục từ phía chúng tôi. Nhiều router có cài đặt này cho phép loại trừ một tên miền, và letsdj.io là tên miền cần loại trừ.

Một chứng chỉ

GET https://api.lets.dj/providers/certificate
Authorization: Bearer <sync token>
{
  "hostname": "0123456789abcdef.letsdj.io",
  "cert": "-----BEGIN CERTIFICATE-----\n…",
  "key": "-----BEGIN PRIVATE KEY-----\n…",
  "notAfter": 1798000000000
}

cert và key ở dạng PEM. notAfter là thời điểm chứng chỉ hết hạn, tính bằng mili giây từ epoch. Chứng chỉ dành cho *.letsdj.io, nên nó bao phủ hostname của bạn trên mọi cổng, và mọi provider nhận cùng một chứng chỉ và khóa, kèm hostname riêng của mình. Phản hồi được đánh dấu Cache-Control: no-store.

Hãy xin nó khi khởi động, rồi lại xin vài lần mỗi ngày. Hãy thay chứng chỉ mới vào ngay khi được cấp, không cần khởi động lại, để các lần gia hạn và mọi lần cấp lại bắt buộc đều đến được một provider đang chạy. Giữ chứng chỉ tốt gần nhất trên đĩa, để một provider khởi động khi không có mạng vẫn phục vụ được cho đến khi nó hết hạn.

  • 503 certificate_unavailable kèm Retry-After: 300: chưa có chứng chỉ nào được cấp. Hãy thử lại sau vài phút.
  • 503 secrets_unavailable: dịch vụ chưa đọc được các bí mật đã lưu của nó vào lúc này.
  • 403 unknown_sync_token, và 401 missing_token.

Những điều chúng tôi sẽ không làm

Chúng tôi không phát hành kèm, đóng gói, cài sẵn, tán thành, dẫn liên kết tới, hay giới thiệu bất kỳ provider bên thứ ba nào. Đó không phải là sự cầu kỳ — Grokster coi việc thiếu các biện pháp bảo vệ là bằng chứng của ý định, và Filmspeler xoay quanh việc cài sẵn và quảng bá. Khoảng cách ấy là thứ làm cho lập trường công cụ trung lập trở nên thật chứ không chỉ để trang trí, và nó chỉ có tác dụng nếu thực sự được giữ vững.

Chúng tôi lưu trữ hai phần hạ tầng, theo cùng điều kiện cho mọi provider. Một provider đang giữ một sync token có thể yêu cầu chúng tôi công bố một cái tên cho địa chỉ của nó (POST /providers/address, bị từ chối trừ khi địa chỉ là riêng tư, link-local hoặc carrier-grade NAT), và có thể lấy chứng chỉ *.letsdj.io dùng chung giúp trình duyệt tin cậy cái tên đó (GET /providers/certificate). Cả hai đều xác thực một sync token và không đọc gì khác.

Cả hai đều không chạm vào nội dung. Media được Stage lấy thẳng từ provider và không bao giờ đi qua chúng tôi, và một danh mục là siêu dữ liệu mà một provider chọn gửi, thứ mà chúng tôi không xem xét cũng không biên tập. Một cái tên và một chứng chỉ là thứ mà bất kỳ dịch vụ web nào cũng cần để trình duyệt truy cập được.