Cloudfront CORS访问问题

时间:2015-05-19 18:50:27

标签: amazon-cloudfront

我试图通过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配置设置正确,我想知道我的代码是否有任何问题。

1 个答案:

答案 0 :(得分:0)

只是回答我自己的问题,希望它能帮助其他人:)

最后,我尝试为我的cloudfront域设置CNAME别名。从这一点开始,我可以在基本域上设置cookie,然后您就可以传递cookie了。

如果人们想知道下一步是什么,让我们更详细一点,让我们使用下面的例子: -

  1. 您正在开发 my.fancy.site.mydomain.com
  2. 您的Cloudfront CNAME是 content.mydomain.com
  3. 确保将您的Cloudfront签名Cookie设置为 .mydomain.com 来自您的精美应用
  4. 从现在开始,您可以传递CF的cookie。
  5. 测试您的Cookie是否设置正确的一种快速方法,尝试获取您的资源网址,并将网址直接放入浏览器中。如果cookie设置正确,您将能够直接访问该文件。
  6. 如果您使用javascript获取cdn资产,请确保在JS代码中,您需要传递withCredentials选项,否则它将无效。例如,如果您使用的是jQuery,则需要以下内容: -

    $.ajax({
       url: a_cross_domain_url,
       xhrFields: {
           withCredentials: true
       }
    });
    

    如果请求成功,您应该从CloudFront获取带有“Access-Control-blah-blah”的响应头。

    希望如果他们搜索这个答案,它可以帮助人们。