2012-05-11 68 views
22

我同時使用ApiKeyAuthentication我Tastypie資源得到以下錯誤,當我嘗試做使用AJAX和Tastypie HTTP請求:「請求頭字段授權不得」的錯誤 - Tastypie

XMLHttpRequest cannot load http://domain.com/api/v1/item/?format=json&username=popo&api_key=b83d21e2f8bd4952a53d0ce12a2314c0ffa031b1. Request header field Authorization is not allowed by Access-Control-Allow-Headers. 

任何想法關於如何解決這個問題?

這裏是請求頭從Chrome中:

Request Headersview source 

Accept:*/* 
Accept-Charset: 
ISO-8859-1,utf-8;q=0.7,*;q=0.3 

Accept-Encoding:gzip,deflate,sdch 

Accept-Language:en-US,en;q=0.8 

Access-Control-Request-Headers: 
origin, authorization, access-control-allow-origin, accept, access-control-allow-headers 

Access-Control-Request-Method: 
GET 

這裏是響應頭從Chrome中:

Response Headersview source 

Access-Control-Allow-Headers: 
Origin,Content-Type,Accept,Authorization 

Access-Control-Allow-Methods: 
POST,GET,OPTIONS,PUT,DELETE 

Access-Control-Allow-Origin:* 

Connection:keep-alive 

Content-Length:0 
Content-Type: 
text/html; charset=utf-8 

Date:Fri, 11 May 2012 21:38:35 GMT 

Server:nginx 

正如你所看到的,他們都有標題授權,但授權不會工作。

這裏是我使用編輯響應頭Django的中間件: https://gist.github.com/1164697

編輯: 我想通了這個問題。我試圖連接到www.domain.com,它只接受domain.com

回答

4

這是因爲Same origin policy

您需要從請求去的同一個域進行AJAX調用。或者進行服務器端更改,允許來自外部域的請求。

通過允許在標題您的外部域解決這個你需要http://domain.com以使頭部的變化:

Access-Control-Allow-Origin: * 

more

+0

AJAX調用來自同一個域。我如何進行服務器端更改以允許來自外部域的請求,以及執行此操作時出現的安全問題是什麼? – egidra

+0

我已經更新了我的回答 – antyrat

+0

我將以下標題添加到了我的所有ajax請求中:'Access-Control-Allow-Origin':'*'。我仍然收到相同的錯誤:請求標頭字段授權不被Access-Control-Allow-Headers所允許。 – egidra

0

的問題是,www.domain.com被視爲不同比domain.com。 domain.com的工作,但當我使用www.domain.com,它檢測到我做不同領域的請求

+3

你應該標記安蒂拉特的答案是正確的。這是更詳細的,提供的鏈接,寫得更早,而且是......你知道......正確。 – Martin

50

安蒂拉特的答案是不完整的。

您必須指定服務器允許的標頭;在你的情況下授權

Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: GET, POST, PUT, DELETE 
Access-Control-Allow-Headers: Authorization 
+2

非常感謝。我想補充一點,我有點「懶惰」,並試圖使用「Access-Control-Allow-Headers:*」,但它不起作用,但通過「授權」它確實有效。 –

+2

同樣在這裏,'*'不起作用,但授權確實 – GoatInTheMachine

2

雖然我upvoted @Manuel BITTO的答案,
我想發佈一個包含完整的一個Cors過濾器與Apache Tomcat上5.x中對我的作品的另一個答案:

public class CorsFilter implements Filter { 

    public CorsFilter() { } 

    public void init(FilterConfig fConfig) throws ServletException { } 

    public void destroy() { } 

    public void doFilter(

      ServletRequest request, ServletResponse response, 
      FilterChain chain) throws IOException, ServletException { 
     HttpServletResponse httpServletResponse = (HttpServletResponse)response; 
     httpServletResponse.addHeader("Access-Control-Allow-Origin", "*"); 
     httpServletResponse.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, OPTIONS, DELETE"); 
     httpServletResponse.addHeader("Access-Control-Allow-Headers", "Authorization"); 

     chain.doFilter(request, response); 
    } 
} 

我建議特別注意將OPTIONS添加到「Access-Control-Allow-Methods」標題值中。
這樣做的原因是,根據由Mozilla提供的here解釋,
如果您的請求(比方說POST)包含特殊頭或內容類型(這是我的情況),那麼XMLHttpRequest對象將生成一個額外的OPTIONS調用,你需要在你的代碼中解決。
我希望這有助於。

0

我知道這個問題是舊的。

但今天我加入owin後遇到了相同的cors問題。在谷歌搜索數量和嘗試各種解決方案後。我通過下面加入解決了cors問題

<remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
<remove name="OPTIONSVerbHandler" /> 
<remove name="TRACEVerbHandler" /> 

欲瞭解更多詳情,請點擊以下鏈接。謝謝。

[http://benfoster.io/blog/aspnet-webapi-cors]

相關問題