CloudFront - NodeJS签名Cookie设置

时间:2016-09-28 01:23:47

标签: node.js amazon-web-services express amazon-s3 amazon-cloudfront

我一直在阅读各种CloudFront文档,了解如何设置已签名的Cookie作为允许访问我的s3存储桶的方法。我已完成以下步骤:

  1. 使用CNAME为files.mysite.com的自定义SSL证书创建分发

  2. 调整行为以限制查看者访问=是和可信签名者=自我

  3. 创建了CloudFront密钥对

  4. 我现在处于实现代码的阶段,以便能够在我的后端签署代码以访问数据,但我不确定如何使用我当前使用的s3签名来设置代码。

    现在我有一个路由设置来签署我的s3数据,以便能够上传和获取我的存储桶文件,同时还保存到我的数据库中的s3文件路径的链接,以用作我网站上的链接到文件:

    appRoutes.get('/sign', function(req, res){
        aws.config.update({accessKeyId: process.env.AWS_ACCESS_KEY, secretAccessKey: process.env.AWS_SECRET_KEY, region: process.env.AWS_REGION});
    
        var uploadDate = new moment().format("YYYY-MM-DD");
        var fileNameFormatted = req.query.file_name.replace(/\s+/g, '-').toLowerCase();
    
        var s3 = new aws.S3()
        var options = {
          Bucket: process.env.AWS_BUCKET,
          Key: req.user.organizationId + '/' + uploadDate + '/' + fileNameFormatted,
          Expires: 60,
          ContentType: req.query.file_type,
          ACL: 'public-read'
        }
    
        s3.getSignedUrl('putObject', options, function(err, data){
          if(err) return res.send('Error with S3')
    
            console.log('This is the data: ' + data);
          res.json({
            signed_request: data,
            url: 'https://' + process.env.AWS_BUCKET + '.s3.amazonaws.com/' + req.user.organizationId + '/' + uploadDate + '/' + fileNameFormatted
          });
        });
    });
    

    在我的视图中,客户端使用javascript,在上传文件时触发此路由:

    function upload(file, signed_request, url, done) {
        var xhr = new XMLHttpRequest();
        xhr.open("PUT", signed_request);
        xhr.setRequestHeader('x-amz-acl', 'public-read');
        xhr.onload = function() {
            if (xhr.status === 200) {
                done();
            };
        };
        xhr.send(file);
    };
    
    function sign_request(file, done) {
        var xhr = new XMLHttpRequest();
        console.log(xhr);
        console.log(file);
        xhr.open("GET", "/app/sign?file_name=" + file.name + "&file_type=" + file.type);
        xhr.onreadystatechange = function() {
            if(xhr.readyState === 4 && xhr.status === 200) {
                console.log(xhr.responseText);
                var response = JSON.parse(xhr.responseText);
                console.log(response);
                done(response);
            }
        };
        xhr.send();
    };
    
    document.getElementById("file-input").onchange = function() {
        var file = document.getElementById("file-input").files[0];
        if (!file) return
            sign_request(file, function(response) {
                console.log('sign_request client file: ' + file);
                console.log('sign_request client response: ' + response);
                upload(file, response.signed_request, response.url, function() {
                    document.getElementById("preview").src = response.url;
                    document.getElementById("file-output").value = response.url;
                });
            });
    };
    

    通过此设置,我不确定CloudFront如何在我的客户端或服务器端代码中签署Cookie。我知道目的是使用files.mysite.com/s3-file-path而不是s3bucket.aws.com来访问这些文件,但是我是否会配置其他客户端代码以使用我的cloudfront签名cookie触发另一个签名路由,然后保存那个链接?

0 个答案:

没有答案