Быстрая аутентификация токена CDN для запросов с пользовательским VCL
Мы искали варианты для защиты наших закодированных видео, хранящихся в GCS и распространяемых через службу CDN Fastly.
Итак, после этого поста - https://docs.fastly.com/guides/tutorials/enabling-url-token-validation
Мы нашли интересную библиотеку для создания токена JWT внутри подпрограммы VCL.
Теперь, когда мы пытаемся попасть в домен - http://cdn.urtutors.com.storage.googleapis.com.global.prod.fastly.net/generate
Он генерирует токен JWT и успешно проходит его проверку здесь - http://cdn.urtutors.com.storage.googleapis.com.global.prod.fastly.net/generate
Но мы хотим перенести генерацию токенов JWT в наши бэкэнд-сервисы, и для этого мы хотим сгенерировать этот токен JWT на нашей стороне сервера и просто использовать часть проверки здесь, в VCL. Теперь я не совсем уверен, почему здесь используется "base64url_nopad" и каковы его альтернативы в node.js, но я думаю, что лучшим вариантом будет просто использовать что-то подобное, например - https://www.npmjs.com/package/jsonwebtoken
для генерации токена jwt с нашей стороны, но как мы можем проверить то же самое с дайджест-объектом в VCL здесь -
set req.http.X-JWT-Header = re.group.1;
set req.http.X-JWT-Payload = re.group.2;
set req.http.X-JWT-Signature = digest.base64url_nopad_decode(re.group.3);
set req.http.X-JWT-Valid-Signature = digest.hmac_sha256("SupSecretStr",
req.http.X-JWT-Header "." req.http.X-JWT-Payload);
// Validate signature
if(digest.secure_is_equal(req.http.X-JWT-Signature, req.http.X-JWT-Valid-Signature)) {
// Decode payload
set req.http.X-JWT-Payload = digest.base64url_nopad_decode(req.http.X-JWT-Payload);
set req.http.X-JWT-Expires = regsub(req.http.X-JWT-Payload, {"^.*?"exp"\s*?:\s*?([0-9]+).*?$"}, "\1");
// Validate expiration
if (time.is_after(now, std.integer2time(std.atoi(req.http.X-JWT-Expires)))) {
// Unauthorized
error 401 "Unauthorized";
}
// OK
error 902;
}