我的服务的一些用户希望能够通过浏览器中的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与授权?或者是否有其他方法选择性地授予跨域访问?
没有办法绕过这种行为——传递授权头是AAAO试图限制的行为之一。但是你可以避开它:
- 为该用户创建一个单独的端点URL。
- 让此端点始终返回允许访问的
Access-Control-Allow-Origin
。(或任何)。 - 让这个端点也总是返回401(未授权)的任何用户,而不是你试图允许的用户。
根据duskwuff的回答,这是不可能的,我采取了这个接近的路线,不必创建新的url:
- 始终接受access-control-allow-origin 选项查询
- 如果一个GET/POST进来,检查选项头。如果用户不在白名单中,检查用户凭据和401。
(通过django中间件很容易实现)