Мы искали варианты защиты наших закодированных видео, хранящихся в 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/validate
Но мы хотим перенести генерацию токена 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;
}