2012-05-11 70 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]

相关问题