'请求标题字段不允许授权'错误 - Tastypie

时间:2012-05-11 09:34:44

标签: javascript django backbone.js tastypie

当我尝试使用AJAX和Tastypie执行HTTP请求时,在为Tastypie资源使用ApiKeyAuthentication时出现以下错误:

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

5 个答案:

答案 0 :(得分:55)

Antyrat的答案并不完整。

您必须指定服务器允许的标头;在您的情况下授权

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

答案 1 :(得分:5)

这是因为Same origin policy

您需要从请求所在的同一域进行AJAX调用。或者进行服务器端更改,允许来自外部域的请求。

要解决此问题,您需要在标题中更改标题http://domain.com

Access-Control-Allow-Origin: *

阅读more

答案 2 :(得分:2)

虽然我赞成了@Manuel Bitto的回答,但是 我想发布另一个答案,其中包含一个完整的Cors Filter,它适用于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);
    }
}

我建议特别注意在“Access-Control-Allow-Methods”标题值中添加OPTIONS。
这样做的原因是根据Mozilla提供的解释here
如果您的请求(假设是POST)包含特殊标头或内容类型(这是我的情况),那么XMLHttpRequest对象将生成一个额外的OPTIONS调用,您需要在代码中解决该调用。
我希望这会有所帮助。

答案 3 :(得分:0)

问题在于,www.domain.com被视为与domain.com不同。 domain.com工作,但当我使用www.domain.com时,它检测到我做了来自不同域的请求

答案 4 :(得分:0)

我知道这个问题比较老了。

但是今天我在加入owin之后遇到了同样的问题。经过多次搜索谷歌和尝试各种解决方案。我在下面添加

解决了问题
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />

有关详情,请点击以下链接。感谢。

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