【问题标题】:'Request header field Authorization is not allowed' error - Tastypie“请求标头字段授权是不允许的”错误 - Tastypie
【发布时间】:2012-05-19 21:41:51
【问题描述】:

当我尝试使用 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

【问题讨论】:

    标签: javascript django backbone.js tastypie


    【解决方案1】:

    我知道这个问题比较老。

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

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

    更多详情请点击以下链接。谢谢。

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

    【讨论】:

      【解决方案2】:

      虽然我赞成@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 调用,您需要在代码中处理它。
      我希望这会有所帮助。

      【讨论】:

        【解决方案3】:

        Antyrat 的回答并不完整。

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

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

        【讨论】:

        • 非常感谢。我想补充一点,我有点“懒惰”并尝试使用 "Access-Control-Allow-Headers: *" ,但它不起作用,但使用 "Authorization" 它确实有效。
        【解决方案4】:

        问题在于 www.domain.com 被视为与 domain.com 不同。 domain.com 有效,但是当我使用 www.domain.com 时,它检测到我正在执行来自不同域的请求

        【讨论】:

        • 您可能应该将antyrat 的答案标记为正确。它更详细,提供链接,写得更早,而且......你知道......正确。
        【解决方案5】:

        这是因为Same origin policy

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

        要解决此问题,您需要更改 http://domain.com 的标头,方法是允许标头中包含您的外部域:

        Access-Control-Allow-Origin: *
        

        阅读more

        【讨论】:

        • AJAX 调用来自同一个域。我将如何进行服务器端更改以允许来自外部域的请求,这样做会出现哪些安全问题?
        • 我在所有 ajax 请求中添加了以下标头:'Access-Control-Allow-Origin': '*'。我仍然收到相同的错误:Access-Control-Allow-Headers 不允许请求标头字段授权。
        • 您需要将此标头添加到响应(服务器端)而不是请求(客户端)
        • 嗯,我还是有问题。我用响应和请求标头更新了我的原始消息。
        • 标记为正确的答案根本不正确。 @egidra 你能接受 Manuel Bitto 或 Antyrat 的答案吗?你能更新你的答案吗?现在很混乱。
        猜你喜欢
        • 2018-10-09
        • 1970-01-01
        • 2015-05-24
        • 2017-10-15
        • 2017-12-19
        • 2017-06-23
        • 2021-07-23
        • 2016-06-12
        相关资源
        最近更新 更多