为了账号安全,请及时绑定邮箱和手机立即绑定

为什么经过身份验证的CORS请求的预检OPTIONS请求在Chrome中有效

为什么经过身份验证的CORS请求的预检OPTIONS请求在Chrome中有效

慕桂英3389331 2019-12-13 15:10:32
我正在编写一个JavaScript客户端,该客户端将包含在第3方网站上(认为Facebook Like按钮)。它需要从需要基本HTTP身份验证的API检索信息。简化的设置如下所示:第三方网站的网页上包含以下代码段:<script async="true"id="web-dev-widget"data-public-key="pUbl1c_ap1k3y"src="http://web.dev/widget.js"></script>widget.js调用API:var el = document.getElementById('web-dev-widget'),    user = 'token',    pass = el.getAttribute('data-public-key'),    url = 'https://api.dev/',    httpRequest = new XMLHttpRequest(),    handler = function() {      if (httpRequest.readyState === 4) {        if (httpRequest.status === 200) {          console.log(httpRequest.responseText);        } else {          console.log('There was a problem with the request.', httpRequest);        }      }    };httpRequest.open('GET', url, true, user, pass);httpRequest.onreadystatechange = handler;httpRequest.withCredentials = true;httpRequest.send();已将API配置为使用适当的标头进行响应:Header set Access-Control-Allow-Credentials: trueHeader set Access-Control-Allow-Methods: "GET, OPTIONS"Header set Access-Control-Allow-Headers: "origin, authorization, accept"SetEnvIf Origin "http(s)?://(.+?\.[a-z]{3})$" AccessControlAllowOrigin=$0Header set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin请注意,将Access-Control-Allow-Origin设置为,Origin而不是使用通配符,因为我正在发送凭证请求(withCredentials)。现在一切就绪,可以发出异步的跨域身份验证请求,并且在OS X 10.8.2的Chrome 25中运行良好。在开发工具中,我可以在OPTIONS请求之前看到请求的网络GET请求,并且响应将按预期返回。在Firefox 19中进行测试时,Firebug中没有向API发出网络请求,并且此错误记录在控制台中: NS_ERROR_DOM_BAD_URI: Access to restricted URI denied经过大量的挖掘,我发现Gecko根据评论不允许用户名和密码直接位于跨站点URI中。我以为这是从使用可选的用户和密码参数开始的,open()所以我尝试了另一种发出经过身份验证的请求的方法,即对Base64编码凭据并发送Authorization标头:// Base64 from http://www.webtoolkit.info/javascript-base64.htmlauth = "Basic " + Base64.encode(user + ":" + pass);...// after open() and before send()httpRequest.setRequestHeader('Authorization', auth);结果是401 Unauthorized对OPTIONS请求的响应导致了Google搜索,例如“为什么这在Chrome而不是Firefox中有效!”。那是我知道自己遇到麻烦的时候。为什么没有它在Chrome和Firefox的不是工作?如何获得OPTIONS一致发送和响应的请求?
查看完整描述

3 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

为什么没有它在Chrome和Firefox的不是工作?


针对CORS预检请求的W3规范明确指出应排除用户凭据。Chrome和WebKit中存在一个错误,其中OPTIONS返回状态为401的请求仍会发送后续请求。


Firefox有一个相关的错误文件,该错误的结尾是一个指向W3公共Web应用程序邮件列表的链接,该链接要求更改CORS规范,以允许OPTIONS对IIS用户有利的请求发送身份验证标头。基本上,他们正在等待这些服务器被淘汰。


如何获得OPTIONS一致发送和响应的请求?


只需让服务器(在此示例中为API)响应OPTIONS请求即可,而无需身份验证。


Kinvey在扩展此功能方面做得很好,同时还链接了Twitter API的一个问题,概述了这种确切情况的catch 22问题,有趣的是,在提交任何浏览器问题之前几周。



查看完整回答
反对 回复 2019-12-14
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

这是一个旧帖子,但是也许可以帮助人们完成CORS问题。要完成基本授权问题,您应该避免对服务器中的OPTIONS请求进行授权。这是一个Apache配置示例。只需在VirtualHost或Location中添加类似的内容即可。


<LimitExcept OPTIONS>

    AuthType Basic

    AuthName <AUTH_NAME>

    Require valid-user

    AuthUserFile <FILE_PATH>

</LimitExcept>



查看完整回答
反对 回复 2019-12-14
?
森栏

TA贡献1810条经验 获得超5个赞

这对我来说很特别。我正在发送一个名为“ SESSIONHASH”的标头。Chrome和Opera没问题,但是Firefox也希望在“ Access-Control-Allow-Headers”列表中使用此标头。否则,Firefox将抛出CORS错误

查看完整回答
反对 回复 2019-12-14
  • 3 回答
  • 0 关注
  • 303 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信