簡體   English   中英

使用 Apache 反向代理處理 plack/PSGI 應用程序的身份驗證

[英]Handling authentication with Apache reverse proxy for plack/PSGI app

這是我的場景:

Apache-反向代理-starman

所以,

  1. 通過加密 HTTPS 的請求轉到 Apache,如: https://server1/MyPerlApp
  2. 如果用戶沒有登錄,他們會重定向到某個登錄頁面(在 server1 中),並且 Apache 不會將請求代理到 Server2
  3. 當用戶登錄 - 經過身份驗證 - 然后 Apache 將所有到達https://server1/MyPerlApp請求轉發到http://server2:5000

問題1:這可能嗎? (問,因為我對Apache的了解不夠深入,這不是一個簡單的:

ProxyPass /MyPerlApp http://server2:5000/

因為我需要在 server1 上對用戶進行身份驗證,並在經過身份驗證時設置ProxyPass Only。 由於 Apache 非常靈活,我認為上述答案是肯定的(但非常歡迎確認和詳細信息) - 所以這里是我的主要具體問題:

  • 我的 Plack 應用程序如何知道哪些用戶在 Apache 級別(在第一台服務器上)進行了身份驗證?
  • 一些用戶信息傳送到 server2 上的perl應用程序的簡單方法是什么? 例如,使用 Apache 的mod_rewriteuser=username參數附加到每個查詢中,
  • Apache 可以設置一些我的perl應用程序應該讀取的 HTTP 標頭嗎?
  • 有沒有簡單又推薦的方法?

我正在尋找如何在我的 starman/perl 應用程序中避免身份驗證例程,因為:

  • 用戶無論如何都需要登錄 server1(對於他的工作流程中的其他任務)
  • 如果他已經登錄,則不需要在我的應用程序中進行身份驗證(避免不必要的雙重登錄)
  • 但我仍然需要知道哪些用戶已登錄(通過 server1 上的 Apache)

已經有類似的問題,但是:

[我想你在這里問了四個問題。 其中一些重疊。 我會盡可能多地回答,然后編輯您的問題以使其更清楚一些。 發布您當前的 Apache httpd.conf可能會有所幫助,以便人們可以了解您當前如何處理訪問和身份驗證。 這樣,您可能會獲得關於如何將代理應用程序與您的 Apache 實例集成的更好建議。]

設置可以處理“網站單點登錄”的前端需要一些規划和配置,但值得付出努力 為了使這更容易,您需要使用 Apache-2.4。 您可能正在使用這個版本,但 Apache 已經成為一種主力,因此某些站點更新它的頻率比過去低得多。 Apache 2.4 包括mod_sessionmod_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_form設置身份驗證比Basic身份驗證更復雜。 但是可以使用基於表單的登錄 javascript(明智地),客戶端應用程序可以在本地存儲表單信息以便快速登錄; 同樣,表單很靈活,可以收集更多數據並向用戶傳遞更多信息,並且某些復雜性(身份驗證后的重定向)可以由 Apache 處理。 由於它們只是一個 HTML <form> ,您可以簡單地開始,並隨着您的站點的增長而使它們更加精細。 也就是說,您可以擁有一個 Apache 反向代理,只需為您的后端提供Basic Auth身份Basic Auth

沒有看到有關您的安裝的更多詳細信息,我無法說明您本身如何/為什么需要mod_rewrite ,但是Rewrite指令可以很好地與ProxyPass 當然,您希望在整個站點中檢查身份驗證和會話信息,並在必要時將用戶重定向到登錄表單。 使用mod_auth_form使這更容易實現,但代價是配置更復雜。 至於反向prosy本身,您將以正常方式使用ProxyPass將請求傳遞到您的后端:

ProxyPass /app http://[starmanhost]:3000/

然后,您需要配置或調整當前的 Apache 系統以啟用Session On並要求以標准 Apache 方式對相關 URL 進行身份驗證(除非整個/需要身份驗證):

<Location /app>
 AuthType Basic
 Session On
 SessionCookieName session path=/
 ...
 require valid-user
</Location>

等等。正如 Apache 文檔指出的那樣(並且您需要閱讀mod_sessionmod_proxy等),您可以傳遞會話信息以供后端應用程序使用。

如果SessionHeader指令用於定義 HTTP 請求標頭,則編碼為 application/x-www-form-urlencoded 字符串的會話將可供應用程序使用。

如果可能,出於隱私/安全考慮,您將希望使用mod_session_crypto和 SSL。 正如您所注意到的,您不需要“端到端”加密(即從客戶端到向外的前端以及反向代理和后端應用程序之間的 HTTPS),但如果外部連接是https://並且您保持會話服務器上的信息(使用mod_session_dbd作為另一個響應指出)使用加密存儲,您可以避免在跨服務器共享用戶會話信息時固有的明顯威脅。 最好的部分是您可以一層一層地添加這些層,而無需大量修改后端應用程序。 這是創建可靠的“WebSSO 服務器”前端來處理登錄的優勢。

請注意,我在這里使用了術語 WebSSO 有點松散。 嚴格來說,WebSSO(和 SSO)是更廣泛、更包含自己的標准軌道和技術的概念(有幾個 Apache 項目專注於此)。 這就是為什么我傾向於將您正在嘗試的方法稱為“網站 SSO”。 對廣泛的身份驗證、編程語言模塊、代理和重寫的支持使 Apache 的httpd成為以這種方式處理登錄和會話的“瑞士軍刀/膠帶”。

您這樣做的理由是合理的,因為您可以避免額外登錄和混淆用戶(及其瀏覽器)。 同樣,通過將身份驗證步驟與您的應用程序分離並將該任務專用於 Apache,您可以讓開發人員更輕松地編寫后端應用程序。 不過你的問題很籠統。 我認為您可以開始嘗試這里開始出現的一些建議,如果您遇到問題,您可以針對您的實施提出更具體的問題。

首先讓 Apache 位正常工作( Session On ; ProxyPass , <Location /app> )並確保前端創建、存儲和傳遞正確的信息。 這對未來的很多事情都非常有用。 Apache 大師可以在這里提供幫助。 將正確的會話信息傳遞給后端后,您可以詢問有關如何使用starmanplack在 perl 代碼中訪問和使用它的plack 工具和文檔中可能存在缺失或粗糙的部分,但許多站點都希望按照您的描述進行操作,以便這些內容會出現並繼續改進。 祝你好運。

參考

Apache 的 mod_session 看起來是您缺少的組件。 由於代理是后端應用程序的網關,它可以處理 HTTP 層上的身份驗證,並根據需要使用代理條目將會話傳回 Perl 腳本。
可以通過幾種方式向 Perl 應用程序公開用戶信息。

mod_session_dbd - 是一個在數據庫中存儲會話信息的模塊。 然后,這可以與托管 Perl 應用程序的后端服務器共享。

mod_session_cookie - 是將會話信息存儲在客戶端瀏覽器上的 cookie 中的模塊。 會話變量將存儲在 cookie 中,Perl 應用程序將檢索它們。

但是,cookie 或在 URL 中放置會話變量會帶來安全問題。 可以修改 Cookie 和標頭。

mod_proxy 應該以 html 的形式將會話變量傳遞回應用程序。

http://httpd.apache.org/docs/trunk/mod/mod_session.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM