CORS Origin设置错误?

时间:2018-02-20 12:37:16

标签: javascript cors browser-security

  1. 我有一个JavaScript应用程序,我们可以说它部署在portal.example.com上。
  2. 其中包含<script>标记,用于加载从assets.example.com提供的来源。
  3. 该JavaScript文件向admin.example.com
  4. 上的API发出HTTP请求

    由于CORS飞行前失败,此API请求出错。

    Failed to load http://admin.example.com/v0/user/navigation: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://portal.example.com' is therefore not allowed access.
    

    实际的OPTIONS请求如下

    OPTIONS /v0/user/navigation HTTP/1.1
    Host: admin.example.com
    Connection: keep-alive
    Access-Control-Request-Method: GET
    Origin: http://portal.example.com
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36
    Access-Control-Request-Headers: authorization,x-correlation-id,x-user-domain
    Accept: */*
    Accept-Encoding: gzip, deflate
    Accept-Language: en-US,en;q=0.9,en-GB;q=0.8
    

    实际的OPTIONS响应如下

    HTTP/1.1 200
    Allow: GET
    Access-Control-Allow-Headers: authorization,x-correlation-id,x-user-domain
    Access-Control-Allow-Methods: GET
    Access-Control-Allow-Origin: http://portal.example.com
    Vary: Origin
    Content-Length: 0
    Date: Tue, 20 Feb 2018 12:12:19 GMT
    Set-Cookie: 97d2c19dadc3933a73dce9bec0748df1=5a15895c5e0f5b526c177132cb4aa666; path=/; HttpOnly
    Cache-control: private
    X-RBT-SCAR: 10.127.48.7:777511903:1000
    

    我认为问题是因为请求实际来自assets.example.com提供的脚本正在发出请求。所以我应该在Access-Control-Allow-Origin: http://assets.example.com回复中返回OPTIONS。但是,我遵循了W3C的建议。

      

    Access-Control-Allow-Origin标头指示是否可以通过返回Origin请求标头的值来共享资源,&#34; *&#34;或&#34; null&#34;在回应中。

    我是误解CORS,还是浏览器发送主执行URL的Origin而不是发出请求的脚本的URL?

    已更新

    获得回应

    HTTP/1.1 200
    X-Correlation-Id: 8978b245-081a-4c4a-b4c9-73f2920ab55c
    Content-Type: application/vnd.example+json
    Transfer-Encoding: chunked
    Date: Tue, 20 Feb 2018 13:22:39 GMT
    Set-Cookie: 97d2c19dadc3933a73dce9bec0748df1=dc4e3543c3071d752959e7176c5e4d29; path=/; HttpOnly
    Cache-control: private
    X-RBT-SCAR: 10.127.48.7:778160108:2000
    

2 个答案:

答案 0 :(得分:5)

No 'Access-Control-Allow-Origin' header is present on the requested resource. 这意味着&#39; Access-Control-Allow-Origin&#39;标题丢失,而不是您的域名不被允许。

如果您没有获得许可,您会看到类似

的内容

The 'Access-Control-Allow-Origin' header has a value 'http://www.example.com' that is not equal to the supplied origin.

因此,要解决您的问题,您需要配置GET响应,以提供必要的CORS标头以及OPTIONS响应。

在您编辑的问题中,GET回复标题并未为Access-Control-*提供任何内容,以便您收到错误!

答案 1 :(得分:1)

您的CORS预检失败 - 您获得200响应和所有必需的CORS响应标头...

但是,您没有在GET响应中返回任何CORS响应标头 - 是失败的。至少,您需要返回一个Access-Control-Allow-Origin响应标头,该标头与OPTIONS响应中返回的标头相匹配。

所以,只需将此信息包含在您的GET回复中,您就可以了:

Access-Control-Allow-Origin: http://portal.example.com

最后,浏览器会添加Origin请求标头,并相信我 - 它是正确的。但是,发送值并不重要,因为所需要的只是Access-Control-Allow-Origin响应标头匹配 Origin请求标头(或者通过具有&#39; *&#39;或与Origin值完全匹配的值。)