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

Posted

技术标签:

【中文标题】如何通过授权信息选择性地允许跨域资源共享?【英文标题】:How do I permit cross-origin resource sharing selectively by authorization information? 【发布时间】:2013-02-16 17:43:35 【问题描述】:

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

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

如果我在 javascript 中这样做:

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

浏览器首先发送一个不带授权头的 ORIGIN METHOD 请求。因此,我无法知道是否应该在响应中包含 Access-Control-Allow-Origin。

xmlhttprequest 中是否有一些设置可以让它发送带有授权的 ORIGIN?还是有其他方法可以选择性地授予跨域访问权限?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

根据黄昏的回答,这是不可能的,我采取了这种接近的方式,不必创建新的网址:

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

(使用 django 中间件很容易实现)

【讨论】:

以上是关于如何通过授权信息选择性地允许跨域资源共享?的主要内容,如果未能解决你的问题,请参考以下文章

如何允许资源所有者使用OAuth2预先授权选定的客户端

遇上浏览器跨域问题怎么办?

如何搞定前端资源服务跨域问题之nginx篇

SpringBoot跨域(CORS)支持:注解@CrossOrigin

可跨域的单点登录(SSO)实现方案

Nginx的反向代理跨域