使用Apache反向代理处理plack/PSGI应用程序的身份验证

kob*_*ame 6 apache perl reverse-proxy plack psgi

这是我的情景:

Apache的反向代理接龙

所以,

  1. 通过加密HTTPS的请求转到Apache,如: https://server1/MyPerlApp
  2. 如果用户未登录,则会重定向到某个登录页面(在server1中),并且Apache不会将请求代理到Server2
  3. 当登录的用户-被验证-再阿帕奇转发所有的请求被即将https://server1/MyPerlApphttp://server2:5000

问题1:这可能吗?(问,因为我不太了解Apache,这不是一个简单的:

ProxyPass /MyPerlApp http://server2:5000/
Run Code Online (Sandbox Code Playgroud)

因为我需要在server1上验证用户身份,并ProxyPass在验证时设置Only.由于Apache非常灵活,我认为上面的答案是肯定的(但确认和细节非常受欢迎) - 所以这是我的主要具体问题:

  • 我的Plack应用程序将如何知道Apache级别(第一台服务器)上的用户身份验证?
  • 什么是将一些用户信息提供给perl服务器2上的应用程序的简单方法?例如,使用Apache 为每个查询mod_rewrite附加一个user=username参数,
  • Apache可以设置我的perl应用应该读取的一些HTTP标头吗?
  • 有一种简单而又重新开始的方式吗?

我正在寻找如何避免我的starman/perl应用程序中的身份验证例程,因为:

  • 用户无论如何都需要登录到server1(对于他工作流程中的其他任务)
  • 如果他已经登录,则不需要在我的应用程序中进行身份验证(避免不必要的双重登录)
  • 但是我仍然需要知道哪些用户已登录(通过server1上的Apache)

已经有类似的问题,但是:

G. *_*ito 9

[我想你在这里问了四个问题.其中一些重叠.我将尝试尽可能多地回答,然后编辑您的问题以使其更清晰一些.发布您当前的Apache可能会有所帮助,httpd.conf以便人们可以看到您当前如何处理访问和身份验证.这样,您可以获得有关如何将代理应用程序与Apache实例集成的更好建议.

设置可以处理"网站单点登录"的前端需要一些规划和配置,但值得付出努力.为了使这更容易,您将需要使用Apache-2.4.你可能正在使用这个版本,但Apache已经成为一种主力,因此有些网站比过去更频繁地更新它.Apache 2.4包含mod_session并且mod_auth_form可以使用Apache为具有多个后端应用程序服务器(通常在不同的机器端口或插槽上运行)的站点设置基于表单的"Web门户单点登录"类型的工具一组URL/URI.这种使用模式在Apache中非常普遍,2.4版本增加了一些功能,使其更容易实现.

您询问了一种"简单推荐"的方式来执行您所描述的操作.那么,你走在正确的轨道上.Apache httpd对于这种身份验证/授权和"用户登录"类型的应用程序非常有用 - 以至于它已成为您尝试执行的操作的主要工具.

您询问了如何"将用户信息"传递给后端服务器.您可以像在任何Web应用程序中处理状态一样执行此操作:使用会话和cookie.会话信息包含编码为application/x-www-form-urlencoded字符串的键/值对.您还可以创建HTTP_SESSION后端应用程序可以读取的环境值.如果你想在那里使用它们,你的Plack/Starman应用程序必须能够处理会话和cookie(即它必须是"会话感知").看看Plack::Middleware::Session如何处理这个问题的想法.

当然,设置身份验证mod_auth_formBasic身份验证更复杂.但是使用基于表单的登录可以使用javascript(明智地),客户端应用程序可以在本地存储表单信息以便快速登录; 同样,表单是灵活的,可以收集更多数据并将更多信息传递给用户,Apache可以处理一些复杂性(身份验证后重定向).由于它们只是一个HTML <form>,因此您可以简单地开始,并在网站增长时使它们更精细.这就是说你可以让Apache Reverse Proxy只Basic Auth为你的后端提供.

没有看到有关安装的详细信息,我不能说如何/为什么需要mod_rewrite 本身,而是Rewrite指令可以发挥很好ProxyPass.当然,在整个站点中,您需要检查身份验证和会话信息,并在必要时将用户重定向到登录表单.使用mod_auth_form使得这更容易实现,代价是更复杂的配置.至于反面的prosy本身,你会ProxyPass以正常的方式将请求传递给你的后端:

ProxyPass /app http://[starmanhost]:3000/
Run Code Online (Sandbox Code Playgroud)

然后,您需要配置或调整当前的Apache系统,以便以标准Apache方式Session On对所涉及的URL进行身份验证(除非整个/需要身份验证):

<Location /app>
 AuthType Basic
 Session On
 SessionCookieName session path=/
 ...
 require valid-user
</Location>
Run Code Online (Sandbox Code Playgroud)

等作为Apache文档指出,(你会想读mod_session,mod_proxy等等),你可以通过周围的会话信息由后端应用.

如果该SessionHeader指令用于定义HTTP请求标头,则编码为application/x-www-form-urlencoded字符串的会话将可供应用程序使用.

对于隐私/安全,您可以使用mod_session_cryptoSSL和SSL(如果可能).正如您所指出的,您不需要加密即"端到端"(即从客户端到面向外端的HTTPS 以及反向代理和后端应用程序之间的HTTPS ),但如果外部连接是https://并且您在服务器上保留会话信息(使用mod_session_dbd加密存储作为另一个响应),您可以避免在服务器之间共享用户会话信息时固有的明显威胁.最好的部分是您可以逐个添加这些层,而无需广泛修改后端应用程序.这是创建一个可靠的"WebSSO服务器"前端来处理登录的优势.

请注意,我在这里使用WebSSO一词有点松散.严格地说,WebSSO(和SSO)具有更广泛和更具包容性的概念,具有自己的标准轨道和技术(有一些Apache项目专注于此).这就是为什么我倾向于称你正在尝试"网站SSO"的方法.支持各种身份验证,编程语言模块,代理和重写,使得Apache httpd成为以这种方式处理登录和会话的首选"瑞士军刀/胶带".

这样做的理由是合理的,因为您可以避免额外的登录和混淆用户(及其浏览器).同样,通过将身份验证步骤与应用程序分离并将该任务专用于Apache,您可以使开发人员更轻松地编写后端应用程序.你的问题很普遍.我认为您可以开始尝试一些开始出现在这里的建议,如果遇到问题,您可以跟进针对您的实施的更具体的问题.

获得第一个正常工作的阿帕奇位(Session On,ProxyPass,<Location /app>),并确保正确的信息是越来越创建,存储和前端传递.这对于未来的许多事情都非常有用.Apache大师可以在这里提供帮助.一旦你有被传递到后端的正确会话信息,您可以询问有关如何访问和你的Perl代码使用它的问题starmanplack.工具和文档中可能存在缺失或粗略的位,但许多网站希望执行您所描述的内容,因此这些内容将会出现并继续改进.祝好运.

参考