如何通过授权信息选择性地允许跨源资源共享?

时间:2013-03-02 05:16:31

标签: javascript http authentication cross-domain cors

我服务的一些用户希望能够通过浏览器中的javascript访问我们的REST API(需要用户凭据)。由于与违反相同原始政策相关的所有漏洞,我不会允许这样做。但是如果某个特定用户需要它并了解正在发生的事情......我希望将他添加到“可以进行交叉来源请求”白名单中。

但是,我无法弄清楚如何根据http授权信息有选择地返回一个Access-Control-Allow-Origin标头。

如果我在javascript中执行此操作:

$.ajax({'url':'url', 'beforeSend': function (xhr) { xhr.setRequestHeader("Authorization", "Basic " + 'base64encodedcreds' ) } })

浏览器首先发送没有Authorization标头的ORIGIN METHOD请求。因此,我无法知道是否应在响应中包含Access-Control-Allow-Origin。

xmlhttprequest中是否有一些设置让它发送带有授权的ORIGIN?或者是否有另一种选择性授予跨域访问的方式?

2 个答案:

答案 0 :(得分:1)

没有办法绕过这种行为 - 传递授权标头是AAAO试图限制的行为之一。但你可以回避它:

  • 为此用户创建单独的端点URL。
  • 让此端点始终返回允许访问的Access-Control-Allow-Origin。 (或者其他什么。)
  • 此端点也始终为您尝试许可的用户以外的任何用户返回401(未授权)。

答案 1 :(得分:1)

根据duskwuff的回答,这是不可能的,我采取这条接近的路线,不必创建新的网址:

  • 始终接受使用access-control-allow-origin
  • 的选项查询
  • 如果有GET / POST,请检查选项标题。如果用户未列入白名单,请检查用户凭据和401。

(很容易用django中间件启动)