Быстрая аутентификация токена CDN для запросов с пользовательским VCL - PullRequest
0 голосов
/ 19 ноября 2018

Мы искали варианты защиты наших закодированных видео, хранящихся в 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;
        }
...