При использовании опции «Доступ по ключу» контент может быть загружен только по запросам, содержащим хеш-ключ. Опция защищает контент от нежелательных загрузок.
Временные ссылки на защищаемый контент будут иметь вид:
http://cdn.example.com/photo.jpeg?md5=DMF1ucDxtHCxwYQ&expires=2147483647
Настройки в личном кабинете
Чтобы включить Tokenized URL, перейдите в раздел «CDN-ресурсы». Напротив нужного CDN-ресурса нажмите «Настройки», выберите «Дополнительные настройки», в разделе «Безопасность» выберите «Добавить опцию» и найдите Tokenized URL.
Активируйте Tokenized URL, в появившемся окне введите желаемый ключ подписи и сохраните настройки. Ключ должен содержать от 6 до 32 символов.
По умолчанию при генерации токена учитываются 4 параметра:
- Время истечения ссылки
- Исходная ссылка на файл
- IP-адреса, для которых разрешен доступ к файлу
- Ключ
Можно настроить токен так, чтобы доступ к файлу был открыт для любых IP-адресов.
Для этого уберите галочку в поле «Добавить IP-адрес к токену» и настройте токен на сервере-источнике так, чтобы параметр IP не учитывался.
Настройка на сервере-источнике
Организуйте сайт таким образом, чтобы обращения пользователей к защищаемым файлам в G-Core CDN производились по временным ссылкам. При обращении серверов CDN, контент должен отдаваться вне зависимости от наличия ключа.
Хеш-ключ — результат вычисления односторонней хеш-функции MD5 (String), где String — параметр, полученный слиянием следующих элементов (в указанной последовательности): <expires><path><ip> <key>
<expires>: Время истечения ссылки. Указывается в формате UNIX Timestamp.
<path>: Исходная ссылка на файл
<key>: Ключ
<IP>: IP-адреса, для которых разрешен доступ к файлу (параметр может не учитываться).
-
Чтобы сгенерировать Unix Timestamp в linux: `date +%s -d "10min"` (текущее время + 10 минут)
CDN-серверы проверяют каждый запрос на своей стороне. Они имеют те же вводные данные (<expires><path><ip> <key>) и используют их для генерации хеш-ключа.
- Если вычисленная подпись не совпала и/или срок действия истек, сервер доставки контента G-core CDN отправляет пользователю ошибку 403 Forbidden.
Если вычисленная подпись совпала и срок действия ссылки не истек, сервер доставки контента G-core CDN передает пользователю запрашиваемый файл.
Способы генерации токена на источнике
PHP-скрипт с параметром IP
<?php
$secret = 'secret_key';
$ip = '1.2.3.4';
$path = '/live/133529_2/chunklist.m3u8';
$expires = time() + 10000;
$link = "$expires$path$ip $secret";
$md5 = md5($link, true);
$md5 = base64_encode($md5);
$md5 = strtr($md5, '+/', '-_');
$md5 = str_replace('=', '', $md5);
$url = "http://cdn.site.com{$path}?md5={$md5}&expires={$expires}";
echo $url;
echo "\n";
PHP-скрипт без параметра IP
<?php
$secret = 'secret_key';
$path = '/live/133529_2/chunklist.m3u8';
$expires = time() + 10000;
$link = "$expires$path $secret";
$md5 = md5($link, true);
$md5 = base64_encode($md5);
$md5 = strtr($md5, '+/', '-_');
$md5 = str_replace('=', '', $md5);
$url = "http://cdn.site.com{$path}?md5={$md5}&expires={$expires}";
echo $url;
echo "\n";
Где:
- $secret — секретный ключ
- $path — путь к файлу
- $ip — IP-адрес, которому разрешено получить контент
- $expires — время жизни ссылки (в секундах)
- $link — строка для генерации токена с учетом необходимых параметров хеш-ключа
- $url — ссылка на файл
Python-скрипт с параметром IP
import base64 from hashlib import md5 from time import time ip = '1.2.3.4' secret = 'secret_key' stream_address = '133529_2' path = f'/live/{stream_address}/playlist.m3u8' expires = int(time()) + 100000 token = base64.encodebytes(md5(f"{expires}{path}{ip} {secret}".encode()).digest()).decode().replace("\n", "").replace("+", "-").replace("/", "_").replace("=", "") secured_url = f"https://cdn.site.com{path}?md5={token}&expires={expires}" print(secured_url)
Python-скрипт без параметра IP
import base64 from hashlib import md5 from time import time secret = 'secret_key' stream_address = '133529_2' path = f'/live/{stream_address}/playlist.m3u8' expires = int(time()) + 100000 token = base64.encodebytes(md5(f"{expires}{path} {secret}".encode()).digest()).decode().replace("\n", "").replace("+", "-").replace("/", "_").replace("=", "") secured_url = f"https://cdn.site.com{path}?md5={token}&expires={expires}" print(secured_url)
Где:
- secret — секретный ключ
- path — путь к файлу
- ip — IP-адрес, которому разрешено получить контент
- expires — время жизни ссылки (в секундах)
- token — генерация токена
- secured_url — ссылка на файл
Использование openssl
В результате вы получите только токен. Его необходимо использовать в ссылках и дополнительно указать время истечения ссылка в UNIX-время.
С параметром IP
echo -n '2147483647/images/1.jpg1.2.3.4 secret_key' | openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =
'2147483647/images/1.jpg1.2.3.4 secret_key' = '{expires}{path}{ip} {secret_key}'
Без параметра IP
echo -n '2147483647/images/1.jpg secret_key' | openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =
'2147483647/images/1.jpg secret_key' = '{expires}{path} {secret_key}'