2013-11-03 61 views
1

我使用Ember.js,Ember Simple Auth插件和jQuery使用ajax發送Authorization標頭跨域。當Authorization頭設置:HTTP標題設置授權標題停止加載數據

jqXHR.setRequestHeader('Authorization', 'Bearer ' + session.get('authToken')); 

然後我得到一個飛行前OPTIONS請求REST URL我然後恢復下列頭:

$headers->set('Access-Control-Allow-Origin', 'http://subdomain2.domain.com'); 
$headers->set('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS'); 
$headers->set('Access-Control-Allow-Headers', 'Content-Type, Authorization, Accept'); 
$headers->set('Access-Control-Max-Age', 10); 
$headers->set('Content-Length', 0); 

在Chrome的網絡監控,這個OPTIONS請求返回成功。然後,當GET請求是飛行前OPTIONS請求後,GET請求剛剛掛起,或者至少說(pending)網絡監控:

enter image description here

如果我刷新頁面幾秒鐘後,頁面會顯示,但在OPTIONS呼叫之後不會立即顯示。

當我玩Access-Control-Max-Age標題並增加緩存時間時,我可以刷新很多次,然後再次發送OPTIONS呼叫,這意味着頁面將顯示正常。只有當OPTIONS呼叫與GET立即掛起之後。

當我直接在瀏覽器中加載url時,它顯示JSON數據就好了。即使當我使用Chrome擴展郵差,並手動設置Authorization頭與jQuery請求相同,它仍然加載數據就好(雖然我不認爲郵差模擬跨域請求)。

任何想法爲什麼GET請求保持掛起狀態並且不返回任何錯誤或頭文件?

回答

2

不太確定問題在這裏。看起來你正在遇到某事。類似這樣的:cross-origin 'Authorization'-header with jquery.ajax()

另外,你有沒有改變Ember.SimpleAuth代碼中的任何東西?因爲默認情況下,出於安全原因,它不應該在跨域請求中包含令牌......

您可能還想看看jQuery中的這個已知問題:Sending credentials with cross-domain posts?也涉及發送授權標頭跨域。

我會看看Ember.SimpleAuth在這種情況下可能會有所幫助。

+0

很奇怪,因爲如果我刷新它似乎工作,所以我做了'OPTIONS'請求後返回正確的標題。我沒有更改'SimpleAuth'代碼 - 我確實注意到if(!jqXHR.crossDomain &&!Ember.isEmpty(session.get('authToken'))){'但'jqXHR'對象沒有包含'crossDomain'屬性......我實際上發現跨域屬性在'options'對象中。可能是系統中的錯誤或差異?我暫時通過將'REST'服務器更改爲相同的域來解決這種情況。我不認爲這是一個SimpleAuth問題,也許是一個錯誤......我不確定。 – Wasim

+0

我也嘗試在發送'Authorization'頭之前添加'jqXHR.withCredentials = true;',但這不能解決問題。 – Wasim

0

我做了一些調查:一般Ember.SimpleAuth應該與CORS一起工作。我認爲你缺少的是對GET請求的響應中的

Access-Control-Allow-Origin: http://subdomain2.domain.com 

頭。另請參閱Mozilla文檔中的示例:https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS。每個響應都必須包含Access-Control-Allow-Origin標頭。

HTH

+0

感謝您的檢查。我肯定返回這個值,你可以從上面的問題中看到'$ headers-> set('Access-Control-Allow-Origin','http://subdomain2.domain.com');'並且它在我刷新時起作用很快,所以它絕對不會阻止跨域請求。也許這是我係統中某個地方的錯誤,我會做更多的探索。 – Wasim

+0

hm,看起來像只有OPTIONS請求響應中的標題不是GET。你還看到日誌中有什麼? – marcoow

+0

對於GET和OPTIONS都沒有。如果我沒有GET,那麼這些請求都不會起作用。似乎很奇怪。 – Wasim