我使用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 /来检查。 OPTIONS都是密码保护的