در پایان این راهنما، لینک امن را روی یک قانون مسیر فعال می‌کنیم تا فقط درخواست‌هایی با توکن معتبر و منقضی‌نشده به محتوا دسترسی داشته باشند.

برای آشنایی با مفهوم و محدودیت‌های لینک امن، لینک امن چیست؟ را مطالعه می‌کنیم. برای جزییات گزینه‌ها و فرمول تولید توکن مرجع تنظیمات لینک امن را دنبال می‌کنیم.


پیش‌نیازها


مراحل

  1. در پنل، از سرویس توزیع محتوا وارد وب‌سایت‌ها می‌شویم و وب‌سایت موردنظر را انتخاب می‌کنیم.
  2. بخش لینک امن را باز می‌کنیم و افزودن Secret جدید را کلیک می‌کنیم.
  3. روش ساخت تولید خودکار (پیشنهادی) را انتخاب می‌کنیم.
  4. ساخت Secret را کلیک می‌کنیم. مقدار Secret را از جدول لیست Secretها کپی می‌کنیم و در تنظیمات سمت سرور اپلیکیشن به‌صورت امن نگهداری می‌کنیم.

امنیت Secret

Secret را در مرورگر، اپلیکیشن عمومی یا مخزن عمومی قرار نمی‌دهیم. هر کسی که به Secret دسترسی داشته باشد، می‌تواند برای محتوای محافظت‌شده توکن معتبر تولید کند.

  1. در همان صفحه لینک امن، تنظیمات را باز می‌کنیم.

تنظیمات لینک امن

  1. مقادیر پیش‌فرض نام پارامتر توکن و نام پارامتر انقضا پذیرفته و محدوده اعتبار توکن را قفل شدن به مسیر (ایمن‌تر) انتخاب می‌کنیم.
  2. تنظیمات را ذخیره را می‌کنیم.
  3. بخش قوانین مسیر (لوکیشن) را باز می‌کنیم و قانون مسیر محتوای محافظت‌شده را ویرایش می‌کنیم؛ برای مثال، /videos/*.
  4. در چه تنظیماتی بر روی مسیر بالا انجام شود؟ گزینه تنظیمات لینک امن را انتخاب می‌کنیم و فعال کردن لینک امن برای این مسیر را روشن می‌کنیم.
  5. ویرایش قانون مسیر را کلیک می‌کنیم.

مسیرهای عمومی

پس از فعال شدن لینک امن روی یک قانون مسیر، درخواست بدون token و expire معتبر با 403 رد می‌شود. این تنظیم را روی مسیر فراگیری مانند /* فعال نمی‌کنیم، مگر اینکه کل آن مسیر باید محافظت شود.

  1. با استفاده از مسیر فایل (path)، زمان انقضا (expire) با فرمت Unix Timestamp بر حسب ثاینه و Secret که از پنل کپی کردیم، توکن را به صورت زیر تولید می‌کنیم.
path = "/videos/premium/episode-1.mp4"
token = MD5(path + secret + expire)

لینک نهایی:

https://[دامنه-CDN][path]?expire=[timestamp]&token=[token]

نمونه ساخت لینک با Python:

from hashlib import md5
from time import time
 
secret = "your_secret_from_cdn_panel"
path = "/videos/premium/episode-1.mp4"
expire = int(time()) + 180
 
token = md5(f"{path}{secret}{expire}".encode("utf-8")).hexdigest()
 
url = f"https://cdn.example.com{path}?expire={expire}&token={token}"
 
print(url)

حالت‌های دیگر فرمول در مرجع تنظیمات لینک امن آمده است.


بررسی صحت

در دستورات زیر، example.com را با دامنه خود جایگزین می‌کنیم.

  1. درخواست بدون امضا باید 403 برگرداند:

    curl -i "https://example.com/videos/premium/episode-1.mp4"
  2. همان مسیر را با expire و token ساخته‌شده در اپلیکیشن درخواست می‌کنیم. اگر امضا و انقضا معتبر باشند، پاسخ نباید 403 باشد:

    curl -i "https://example.com/videos/premium/episode-1.mp4?expire=EXPIRE&token=TOKEN"
  3. در مشاهده لحظه‌ای لاگ درخواست‌ها، مقدار location را بررسی می‌کنیم تا مسیر با قانون مسیر موردنظر مطابقت داشته باشد. درخواست بدون امضا باید status برابر 403 داشته باشد.

اگر لینک امضاشده نیز 403 است، موارد زیر را بررسی می‌کنیم:

  • مسیر داخل هش دقیقا همان مسیر URI درخواست است، با / شروع می‌شود و Query String ندارد.
  • expire از زمان فعلی بزرگ‌تر است.
  • Secret همان مقدار جدول لیست Secretها است.
  • نام پارامترهای Query با تنظیمات پنل یکسان است.
  • اگر محدودیت IP روشن است، IP استفاده‌شده برای ساخت توکن با IP درخواست مطابقت دارد.

ادامه مسیر