为了避免牦牛剃须,我将尝试提供尽可能多的上下文。
我们有一个内部应用程序,它也可以在公共互联网上使用。该应用程序在 IBM i 上的多个 Apache 实例上运行——这些实例中的大多数都需要 http 基本身份验证,可以说是充当“欢迎页面”的一个实例除外。这个“欢迎页面”没有身份验证,但充当导航中心,用户可以通过链接转到应用程序的其他部分(这些部分具有身份验证并在不同的 Apache 实例上运行)。
我们还有一些文档存储在 Confluence(一个 wiki 应用程序)中,运行在单独的服务器上。此 wiki 应用程序可以显示文档而无需身份验证,但如果您进行身份验证,则可以选择编辑文档(当然,假设您被授权这样做)。但关键是文档是可见的,无需身份验证。
我的问题是:我们希望可以从主应用程序中访问 Confluence 中的文档(无论是在内部访问还是通过 Internet 访问时),但是由于文档有些敏感,我们不希望整个 Internet 都可以访问它.
我们提出的解决方案是使用反向代理——我们在主应用程序上配置 Apache 实例,以便将主应用程序/help/
上的请求代理到汇合应用程序。因此,Confluence 应用程序不会直接暴露在 Internet 上。
但这就是问题开始的地方。
如果我们只是通过不需要身份验证的主应用程序 Apache 实例进行代理/help/
,那么文档可以从主应用程序中毫无问题地获得 - 但由于您不需要身份验证,因此互联网上的每个人都可以使用它 - 所以这是不行的。
如果我们改为通过需要身份验证的主应用程序 Apache 实例代理“/help/”,似乎基本身份验证信息从主应用程序服务器传递到 Confluence 服务器,然后我们得到身份验证失败,因为没有每个使用主应用程序的人在 Confluence 服务器上都有一个帐户。(对于那些这样做的人,它可以正常工作 - 但大多数用户不会拥有 Confluence 帐户)。
(从现在开始可能会发出牦牛剃毛警报)
因此,似乎在处理 HTTP 基本身份验证时,如果您设置从服务器 A 到服务器 B 的代理配置,并在服务器 A 上设置代理以要求 HTTP 基本身份验证,那么该身份验证信息会直接传递给服务器 B,在这种情况下,服务器 B 会抱怨,因为它不需要身份验证信息。
我对这个问题的解决方案是设置 2 个级别的代理 - 使用需要身份验证的 Apache 实例也需要对代理进行身份验证/help/
,但/help/
代理到不同的服务器(服务器 C)。此服务器 C 不需要身份验证,但不会暴露在 Internet 上。服务器 C 被配置为代理/help/
到实际的 Confluence 服务器。
我这样做是基于proxy-chain-auth
- 一个环境变量,它似乎表明默认情况下,如果您有代理链,则不会自动沿链发送身份验证信息。
唉,这不起作用 - 我收到一个身份验证错误,似乎表明服务器 C 实际上代理了身份验证信息,即使我没有设置proxy-chain-auth
.
所以,这就是我的剃牦牛之旅。
我只是想设置一个配置,以便我们存储在 Confluence 上的文档需要某种身份验证,但该身份验证来自主应用程序,而不是来自 Confluence。
(如果不需要通过 Internet 访问它,这一切都不会成为问题,因为 Confluence 服务器可以被其网络上的任何人查看而没有问题)。
我希望我的问题足够清楚 - 老实说,我不介意被指向不同的方向来实现主要目标,但需要注意的是,我无法使用 HTTP 基本身份验证更改主应用程序(或 Confluence) .
想法,有人吗?
PS。为了从 Confluence 服务器中检索文档,我实际上是在使用他们的 REST API 来检索页面内容——我不知道这是否有任何相关性,但我只是想明确一点,以防万一。