2015-05-19 52 views
0

我試圖通過cloudfront訪問我的s3資產,並且我發送了這個ajax請求並傳入了這些set-cookie標頭。Cloudfront CORS訪問問題

我能夠生成簽名的url,它完全正常工作,但我真正想做的是使用簽名的cookie方法來訪問資源。

以下是我的測試代碼,但我得到的是(再沒有「訪問控制允許來源」標頭出現在所請求的資源。)

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

那麼,你有沒有做任何事情來啓用CORS? – CBroe

+0

你能告訴我們有關通過電線發送的標題的全部細節嗎? – Marged

+0

@CBroe,是的,我有,我甚至有亞馬遜團隊來審查我們的雲端配置。 –

回答

0

剛剛發佈的答案我自己的問題,希望它可以幫助別人:)

最後,我嘗試建立一個CNAME別名爲我的CloudFront的域。從這個角度來說,我可以在基本域上設置cookie,然後你就可以傳遞你的cookie。

讓我們把更多的細節它的情況下,人們想知道什麼將是下一個步驟是,讓我們用下面的例子: -

  1. 你正在開發的my.fancy.site.mydomain。 COM
  2. 你的Cloudfront CNAME是content.mydomain.com
  3. 確保你從你看中的應用程序設置您的CloudFront的簽署餅乾.mydomain.com來
  4. 從此時起,您可以通過CF的Cookie。
  5. 快速測試您的Cookie是否設置正確的一種方法是,嘗試獲取您的資產URL,然後將該URL直接放入瀏覽器中。如果cookie設置正確,您將能夠直接訪問該文件。

如果您使用JavaScript獲取cdn資產,請確保在您的JS代碼中,您需要傳遞withCredentials選項,否則它將無法工作。例如,如果你正在使用jQuery,你需要像下面這樣: -

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

如果請求成功,您應該從CloudFront的響應標頭「訪問控制,誇誇其談」 。

希望它可以幫助人們,如果他們搜索這個答案。