使用自定义VCL对请求进行快速CDN令牌认证

时间:2018-11-19 15:20:49

标签: jwt varnish-vcl http-token-authentication fastly fastly-vcl

我们一直在寻找方案来保护存储在GCS中并通过Fastly的CDN服务分发的编码视频。

所以,在这篇文章之后-https://docs.fastly.com/guides/tutorials/enabling-url-token-validation

我们找到了一个有趣的库here,用于在VCL子例程中创建JWT令牌。

现在,当我们尝试访问域-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;
        }

0 个答案:

没有答案