如何在使用CORS头文件时将基本身份validation添加到apache代理?

背景

我使用grafana来显示我们的服务器度量的graphics。 Grafana是一个JS应用程序,在我们的例子中是从石墨中获取数据并在elasticsearch中存储search查询。 所有这三个服务都有自己的虚拟主机,虽然现在在同一台机器上。 由于JS规则,我添加了CORS头到石墨和elasticsearch-vhost。 graphite-vhost是WSGI的路由请求,因为石墨是一个python / django应用程序。 elasticsearch-vhost是将数据从端口443转发到localhost:9200反向代理。 这有助于不直接向世界开放elasticsearch服务,也给我一个添加CORS头的地方。 到目前为止,这是有效的:grafana可以同时与两个服务进行通信。

出现问题

我添加了Basic Auth身份Basic Auth的grafana和石墨主机。 这些工作正常,如预期。 Grafana能够检索和显示数据。

当将Basic Auth添加到elasticsearch-vhost时,我遇到了问题。 虽然我可以在<Location / >块中添加Auth设置,但似乎禁用了CORS头。 激活身份validation后,我可以在浏览器或curl中使用elasticsearch。

但是,grafana无法在elasticsearch中searchconfiguration的仪表板。

search似乎更复杂,一个GET ,因为grafana开始与OPTIONS -request。 这失败了一个401错误。 有趣的是,Grafana可以检索已知的仪表板(这是一个简单的GET )。

我没有提到在Headers中限制HTTP方法。

所以,总结一下:

 How can I add basic auth to an apache proxy while using CORS headers? 

如果你想看看Apache的configuration,请告诉我哪些部分,我不想张贴三个相当长的虚拟主机“只是可以肯定”。

我通过总是允许OPTIONS -requests来解决这个问题。 这些请求只作为一个“ping”来检查服务器是否在那里。

 <Proxy *> Order deny,allow Allow from all AuthType Basic AuthBasicProvider file AuthUserFile /path/to/passwords # This allows OPTIONS-requests without authorization <LimitExcept OPTIONS> Require valid-user </LimitExcept> </Proxy> 

一个更清洁的方法可能是改变grafana以及如何提出请求,但是这样可以解决当前的问题,而不会打开新的问题。

从安全的angular度来看,这并不会让事情变得更糟:

  • 目前OPTIONS没有一个机构来揭示更多的信息
  • OPTIONS是幂等的,它总是什么都不做
  • 服务器的存在也可以用较重的GET /来检查。
  • 所有其他的HTTP方法,但OPTIONS都是密码保护的