Защищенные токены
С помощью защищенных токенов (secure token) вы можете ограничить доступ к файлам CDN-ресурса. Это используется, например, для временного или платного доступа к файлам, а также для обеспечения безопасности чувствительных данных.
Доступ к файлам осуществляется по подписанным ссылкам с ограниченным сроком действия, query-параметры которых содержат защищенный токен. CDN-сервер по хэшу сверяет полученный токен с секретным ключом CDN-ресурса и переданными в HTTP-запросе данными и разрешает или запрещает доступ к файлу.
Также с помощью защищенных токенов можно задать доверенный IP-адрес, с которого будет разрешен доступ к CDN-ресурсу.
Вы можете включить для CDN-ресурса доступ по защищенному токену с помощью консоли управления
Если для CDN-ресурса включен доступ по защищенному токену, контент доступен только по подписанным ссылкам. Чтобы сохранить доступ к части контента по обычным ссылкам, создайте для этого контента еще один CDN-ресурс с отдельным источником.
Подробности о защищенном токене см. в документации CDN-провайдера EdgeЦентр:
Подписанная ссылка
Подписанная ссылка генерируется вне CDN-ресурса, например на основном легковесном сайте, и содержит следующие query-параметры:
md5
— защищенный токен в кодировке Base64 , который является MD5 -хэшем строки, состоящей из элементов:- Секретный ключ — произвольная строка длиной от 6 до 32 символов.
- Срок действия ссылки — момент времени в Unix-формате
, после которого доступ к файлу будет запрещен. Начать скачивание файла можно до истечения срока действия, а завершить можно и после. - Путь к файлу в источнике.
- (опционально) Доверенный IP-адрес, с которого разрешено скачивать файл. Задается, если для CDN-ресурса включено ограничение доступа по IP-адресу. Если ограничение не задано, доступ к файлам будет разрешен с любых IP-адресов. Задать ограничение доступа по IP-адресу можно как при включении доступа по защищенному токену, так и позднее.
expires
— срок действия ссылки в Unix-формате.
Пример подписанной ссылки:
http://cdn.example.com/files/image.jpg?md5=xu7AXOAOQ********Ua0xw&expires=1701609223
Примеры
Чтобы сформировать подписанную ссылку, воспользуйтесь одним из примеров.
Подписанная ссылка с ограничением доступа по IP-адресу
Примечание
Подключение VPN может мешать корректной работе подписанных ссылок с ограничением доступа по IP-адресу. Для корректной работы ссылок отключите VPN.
<?php
$secret = '<секретный_ключ>';
$path = '<путь_к_файлу>';
$ip = '<IP-адрес>';
$expires = time() + <срок_действия_ссылки>;
$hostname = '<доменное_имя>';
$link = "$expires$path$ip $secret";
$md5 = md5($link, true);
$md5 = base64_encode($md5);
$md5 = strtr($md5, '+/', '-_');
$md5 = str_replace('=', '', $md5);
$url = "{$hostname}{$path}?md5={$md5}&expires={$expires}";
?>
Где:
$secret
— секретный ключ — произвольная строка длиной от 6 до 32 символов.$path
— путь к файлу, для доступа к которому генерируется ссылка. Например:/files/image.jpg
.$ip
— доверенный IP-адрес, c которого будет разрешен доступ к файлу. Например:1.2.3.4
.$expires
— момент времени в Unix-формате , после которого ссылка станет недействительной,<срок_действия_ссылки>
— срок действия ссылки в секундах с момента генерации ссылки.$hostname
— доменное имя CDN-ресурса с указанием схемы (http
илиhttps
). Например:https://cdn.example.com
.$url
— готовая подписанная ссылка на файл.
import base64
from hashlib import md
from time import time
ip = '<IP-адрес>'
secret = '<секретный_ключ>'
path = f'<путь_к_файлу>'
expires = int(time()) + <срок_действия_ссылки>
hostname = '<доменное_имя>'
token = base64.encodebytes(md5(f"{expires}{path}{ip} {secret}".encode()).digest()).decode().replace("\n", "").replace("+", "-").replace("/", "_").replace("=", "")
secured_url = f"{hostname}{path}?md5={token}&expires={expires}"
Где:
ip
— доверенный IP-адрес, c которого будет разрешен доступ к файлу. Например:1.2.3.4
.secret
— секретный ключ — произвольная строка длиной от 6 до 32 символов.path
— путь к файлу, для доступа к которому генерируется ссылка. Например:/files/image.jpg
.expires
— момент времени в Unix-формате , после которого ссылка станет недействительной,<срок_действия_ссылки>
— срок действия ссылки в секундах с момента генерации ссылки.hostname
— доменное имя CDN-ресурса с указанием схемы (http
илиhttps
). Например:https://cdn.example.com
.secured_url
— готовая подписанная ссылка на файл.
#!/bin/bash
# This script generates a signed link with IP-based restricted access
let "EXPIRES=$(date +%s) + <срок_действия_ссылки>"
HOSTNAME="<доменное_имя>"
FILEPATH="<путь_к_файлу>"
IP="<IP-адрес>"
SECRET="<секретный_ключ>"
TOKEN=$(echo -n $EXPIRES$FILEPATH$IP' '$SECRET | openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d = )
echo $HOSTNAME$FILEPATH'?md5='$TOKEN'&expires='$EXPIRES
Где:
$EXPIRES
— момент времени в Unix-формате , после которого ссылка станет недействительной,<срок_действия_ссылки>
— срок действия ссылки в секундах с момента генерации ссылки.$HOSTNAME
— доменное имя CDN-ресурса с указанием схемы (http
илиhttps
). Например:https://cdn.example.com
.$FILEPATH
— путь к файлу, для доступа к которому генерируется ссылка. Например:/files/image.jpg
.$IP
— доверенный IP-адрес, c которого будет разрешен доступ к файлу. Например:1.2.3.4
.$SECRET
— секретный ключ — произвольная строка длиной от 6 до 32 символов.
Подписанная ссылка без ограничения доступа по IP-адресу
<?php
$secret = '<секретный_ключ>';
$path = '<путь_к_файлу>';
$expires = time() + <срок_действия_ссылки>;
$hostname = '<доменное_имя>';
$link = "$expires$path $secret";
$md5 = md5($link, true);
$md5 = base64_encode($md5);
$md5 = strtr($md5, '+/', '-_');
$md5 = str_replace('=', '', $md5);
$url = "{$hostname}{$path}?md5={$md5}&expires={$expires}";
?>
Где:
$secret
— секретный ключ — произвольная строка длиной от 6 до 32 символов.$path
— путь к файлу, для доступа к которому генерируется ссылка. Например:/files/image.jpg
.$expires
— момент времени в Unix-формате , после которого ссылка станет недействительной,<срок_действия_ссылки>
— срок действия ссылки в секундах с момента генерации ссылки.$hostname
— доменное имя CDN-ресурса с указанием схемы (http
илиhttps
). Например:https://cdn.example.com
.$url
— готовая подписанная ссылка на файл.
import base64
from hashlib import md5
from time import time
secret = '<секретный_ключ>'
path = f'<путь_к_файлу>'
expires = int(time()) + <срок_действия_ссылки>
hostname = '<доменное_имя>'
token = base64.encodebytes(md5(f"{expires}{path} {secret}".encode()).digest()).decode().replace("\n", "").replace("+", "-").replace("/", "_").replace("=", "")
secured_url = f"{hostname}{path}?md5={token}&expires={expires}"
Где:
secret
— секретный ключ — произвольная строка длиной от 6 до 32 символов.path
— путь к файлу, для доступа к которому генерируется ссылка. Например:/files/image.jpg
.expires
— момент времени в Unix-формате , после которого ссылка станет недействительной,<срок_действия_ссылки>
— срок действия ссылки в секундах с момента генерации ссылки.hostname
— доменное имя CDN-ресурса с указанием схемы (http
илиhttps
). Например:https://cdn.example.com
.secured_url
— готовая подписанная ссылка на файл.
#!/bin/bash
# This script generates a signed link with no IP address restrictions
let "EXPIRES=$(date +%s) + <срок_действия_ссылки>"
HOSTNAME="<доменное_имя>"
FILEPATH="<путь_к_файлу>"
SECRET="<секретный_ключ>"
TOKEN=$(echo -n $EXPIRES$FILEPATH' '$SECRET | openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d = )
echo $HOSTNAME$FILEPATH'?md5='$TOKEN'&expires='$EXPIRES
Где:
$EXPIRES
— момент времени в Unix-формате , после которого ссылка станет недействительной,<срок_действия_ссылки>
— срок действия ссылки в секундах с момента генерации ссылки.$HOSTNAME
— доменное имя CDN-ресурса с указанием схемы (http
илиhttps
). Например:https://cdn.example.com
.$FILEPATH
— путь к файлу, для доступа к которому генерируется ссылка. Например:/files/image.jpg
.$SECRET
— секретный ключ — произвольная строка длиной от 6 до 32 символов.