我一直在阅读各种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触发另一个签名路由,然后保存那个链接?