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

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

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

  • 创建了CloudFront密钥对

我现在正处于实现代码的阶段,以便能够在我的后端签署代码来访问数据,但我不确定如何使用我当前使用的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触发另一个签名路由,然后保存该链接?