Токенная аутентификация позволяет ограничить доступ к документам, файлам и медиа избранным пользователям без необходимости регистрации. Это помогает защитить платный/ограниченный контент от паразитного скачивания и несанкционированного распространения.
Настроить аутентификацию по токену можно двумя способами: через Cloudflare Workers или через пользовательские правила.
Вариант 1: настройка с помощью Cloudflare Workers
Обратитесь к следующим ресурсам Cloudflare Workers с двумя разными реализациями аутентификации по токену:
Вариант 2: настройка с помощью пользовательских правил
Используйте язык Rules is_timed_hmac_valid_v0() для валидации токенов HMAC (hash-based message authentication code) в выражении пользовательского правила.
Чтобы проверить аутентификацию по токену, создайте пользовательское правило вызовом is_timed_hmac_valid_v0() (функция) в выражении правила. Можно использовать действие, например Block.
Пример правила
Этот пример иллюстрирует правило, блокирующее любого посетителя, не прошедшего валидацию HMAC-ключа на определённом имени хоста и пути URL. Для аутентификации по токену требуются:
Секретный ключ для генерации и валидации HMAC (например, mysecrettoken)
Путь, который вы хотите аутентифицировать (например, downloads.example.com/images/cat.jpg)
Имя параметра строки запроса, содержащего токен (например, verify)
Время жизни токена в секундах (например, 3 часа = 10 800 секунд)
is_timed_hmac_valid_v0() сравнивает значение MAC, сгенерированного с использованием mysecrettoken секретный ключ со значением, закодированным в http.request.uri.
Если значения MAC совпадают и срок действия токена ещё не истёк согласно следующей формуле:
Тогда токен действителен, и is_timed_hmac_valid_v0() (функция) возвращает true.
Генерация HMAC-токенов
Следующие примеры показывают, как генерировать токены на вашем сервере-источнике для пути, проверяемого пользовательским правилом из предыдущего раздела:
Полный пример на JavaScript (JS) или TypeScript (TS) см. в Подпись запросов в документации Workers.
Поскольку пример реализации на JS/TS совместим с is_timed_hmac_valid_v0() функции, запросы, аутентифицированные с помощью предоставленного исходного кода, можно проверять пользовательским правилом WAF и полем is_timed_hmac_valid_v0() функции.
Будет сгенерирован URL-параметр, подобный следующему:
Один и тот же секретный ключ можно использовать для защиты нескольких URI-путей.
Это показано в предыдущем примере, где http.request.uri передаётся как MessageMAC аргумент в функцию валидации.
Поскольку http.request.uri содержит путь к ресурсу и это значение извлекается для каждого запроса, функция валидации рассматривает все URI запросов к downloads.example.com с использованием того же секретного ключа.
Обратите внимание: хотя один и тот же секретный ключ можно использовать для аутентификации нескольких путей, HMAC-токен необходимо генерировать для каждого уникального сообщения, которое вы хотите аутентифицировать.
Защита целого префикса пути URI одной подписью
Вы можете защитить целый префикс пути URI фиксированной длины одной HMAC-подписью (с тем же секретом). Для этого передайте префикс пути URI (вместо полного пути URI) и исходную строку запроса в качестве MessageMAC аргумент для is_timed_hmac_valid_v0() функции.
Используйте substring(), чтобы получить префикс из полного пути URI.
В следующем примере префикс пути URI, требующий одной HMAC-подписи, всегда имеет длину 51 символ (x — символ-заполнитель):
Первые два пути URI могут использовать одну и ту же HMAC-подпись, потому что у них общий префикс из 51 символа (/case-studies/12345678-90ab-4cde-f012-3456789abcde/), который проверяется пользовательским правилом.
Третьему URI-пути нужна другая HMAC-подпись, поскольку префикс отличается.