Аутентификация по токену позволяет ограничить доступ к документам, файлам и медиафайлам, предоставив его только выбранным пользователям без необходимости регистрации. Это помогает защитить платный или закрытый контент от воровства трафика и несанкционированного распространения.
Существует два варианта настройки аутентификации по токену: через Cloudflare Workers или через пользовательские правила.
Вариант 1: настройка с помощью Cloudflare Workers
См. следующие материалы Cloudflare Workers о двух разных вариантах реализации аутентификации по токену:
Вариант 2: настройка с помощью пользовательских правил
Используйте язык Rules is_timed_hmac_valid_v0() Функция проверки HMAC для проверки токенов кода аутентификации сообщений на основе хеша (HMAC) в выражении пользовательского правила.
Чтобы проверить аутентификацию по токену, создать пользовательское правило с вызовом 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() функцию.
Защита нескольких путей с помощью одного и того же секрета
Один и тот же секретный ключ можно использовать для защиты нескольких путей 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 длиной 51 символ потребуется своя подпись HMAC.
Если вы хотите блокировать запросы к файлам из этого примера, не прошедшим проверку HMAC, вы можете создать пользовательское правило, подобное следующему:
Выражение правила:
(http.host eq "downloads.example.com" and starts_with(http.request.uri.path, "/case-studies") and not is_timed_hmac_valid_v0("mysecrettoken", concat(substring(http.request.uri.path, 0, 51), "?", http.request.uri.query), 10800, http.request.timestamp.sec, 1))
Первые два пути URI могут использовать одну и ту же подпись HMAC, поскольку у них общий префикс длиной 51 символ (/case-studies/12345678-90ab-4cde-f012-3456789abcde/) которое проверяется пользовательским правилом.
Третий путь URI требует другой подписи HMAC, так как префикс отличается.