我试图通过cloudfront访问我的s3资产,然后我发出了这个ajax请求并传入了这些set-cookie标头。
我能够生成已签名的网址并且它完全正常,但我真正想要做的是使用签名的Cookie方法来访问资源。
以下是我的测试代码,但我得到的是 403 (然后在请求的资源上出现No&#39; Access-Control-Allow-Origin&#39;标头。)< / p>
function getCookie(name)
{
var re = new RegExp(name + "=([^;]+)");
var value = re.exec(document.cookie);
return (value != null) ? decodeURIComponent(value[1]) : null;
}
// I try to use XMLHttpRequest
// ---------------------------------------------
var oReq = new XMLHttpRequest();
oReq.open("GET", 'http://a_cloudfront_url/mystuff.json', false);
oReq.setRequestHeader("Set-Cookie", "Domain=my_domain.com; Path=/; Secure; HttpOnly; CloudFront-Expires="+getCookie('CloudFront-Expires'));
oReq.setRequestHeader("Set-Cookie", "Domain=my_domain.com; Path=/; Secure; HttpOnly; CloudFront-Key-Pair-Id="+getCookie('CloudFront-Key-Pair-Id'));
oReq.setRequestHeader("Set-Cookie", "Domain=my_domain.com; Path=/; Secure; HttpOnly; CloudFront-Signature="+getCookie('CloudFront-Signature'));
oReq.send();
// I also try to use the jquery ways
// ---------------------------------------------
$.ajax({
type: 'GET',
url: 'http://a_cloudfront_url/mystuff.json',
xhrFields: {
withCredentials: true
},
beforeSend: function(xhr){
xhr.setRequestHeader("Set-Cookie", "Domain=my_domain.com; Path=/; Secure; HttpOnly; CloudFront-Expires="+getCookie('CloudFront-Expires'));
xhr.setRequestHeader("Set-Cookie", "Domain=my_domain.com; Path=/; Secure; HttpOnly; CloudFront-Key-Pair-Id="+getCookie('CloudFront-Key-Pair-Id'));
xhr.setRequestHeader("Set-Cookie", "Domain=my_domain.com; Path=/; Secure; HttpOnly; CloudFront-Signature="+getCookie('CloudFront-Signature'));
},
success: function (data) {
console.log('success');
},
error: function (e) {
console.log('Error',e);
}
});
但所有人只给我403 ......
以下是我的回复标题看起来像......
// The following is my response header
// ---------------------------------------------
Connection:keep-alive
Content-Length:146
Content-Type:text/xml
Date:Tue, 19 May 2015 19:22:04 GMT
Server:CloudFront
Via:1.1 blah-blah.cloudfront.net (CloudFront)
X-Amz-Cf-Id:GNQKtum1Rz4eblah-blahWqGQXPOtowD1ZrBbIAx6aGB0j_AMbA==
X-Cache:Error from cloudfront
以下是我的请求标题看起来像......
// The following is my request header
// ---------------------------------------------
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,zh-TW;q=0.6,zh;q=0.4
Access-Control-Request-Headers:set-cookie
Access-Control-Request-Method:GET
Connection:keep-alive
Host:my_cloud_front_doman.cloudfront.net
Origin:http://my_domain.com
Referer:http://my_domain.com/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4)
感谢任何帮助。我与亚马逊代表交谈,他们说clouldfront配置设置正确,我想知道我的代码是否有任何问题。
答案 0 :(得分:0)
只是回答我自己的问题,希望它能帮助其他人:)
最后,我尝试为我的cloudfront域设置CNAME别名。从这一点开始,我可以在基本域上设置cookie,然后您就可以传递cookie了。
如果人们想知道下一步是什么,让我们更详细一点,让我们使用下面的例子: -
如果您使用javascript获取cdn资产,请确保在JS代码中,您需要传递withCredentials选项,否则它将无效。例如,如果您使用的是jQuery,则需要以下内容: -
$.ajax({
url: a_cross_domain_url,
xhrFields: {
withCredentials: true
}
});
如果请求成功,您应该从CloudFront获取带有“Access-Control-blah-blah”的响应头。
希望如果他们搜索这个答案,它可以帮助人们。