[英]Request header field Authorization is not allowed (AngularJS rest api request)
[英]'Request header field Authorization is not allowed' error - 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
Antyrat的答案并不完整。
您必须指定服务器允许的标头; 在您的情况下授权 。
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Authorization
这是因为同源策略 。
您需要从请求所在的同一域进行AJAX调用。 或者进行服务器端更改,允许来自外部域的请求。
要解决此问题,您需要在http://domain.com中对标头进行更改,方法是在标头中添加外部域:
Access-Control-Allow-Origin: *
阅读更多
虽然我赞成@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,
如果您的请求(假设是POST)包含特殊标头或内容类型(这是我的情况),那么XMLHttpRequest对象将生成一个额外的OPTIONS调用,您需要在代码中解决该调用。
我希望这有帮助。
问题是www.domain.com被认为与domain.com不同。 domain.com工作,但当我使用www.domain.com时,它检测到我做了来自不同域的请求
我知道这个问题比较老了。
但是今天我加入了owin后遇到了同样的问题。 经过多次搜索谷歌和尝试各种解决方案。 我在下面添加了解决了cors问题
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
有关详细信息,请按照以下链接。 谢谢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.