2009-04-26 59 views
3

我想實現一個處理許多站點登錄的分立遠程認證服務器。有點類似於OpenID。如何實現單點登錄認證服務器?

基本上,我有站點1和站點2,他們都依賴於同一個用戶數據庫,這是在一個單獨的認證站點。所以,auth-site爲它們處理用戶認證,並且在這個過程中,使認證用戶的信息可用於請求系統。

每個站點都可以在完全獨立的域名上,在完全獨立的機器上。

這都是通過HTTP(S),不能直接訪問數據庫。

還有最後一個怪癖:一旦用戶登錄到站點1,當訪問任何依賴auth站點的其他站點時,該站點必須將用戶視爲已經通過身份驗證。

這整個業務必須對最終用戶完全免費。它應該像一個簡單的日常登錄表單一樣工作。

作爲一個具體的例子,說我們在談論stackoverflow.comserverfault.com,他們都通過authentic-overflow-server-stack.com驗證。再次,一旦登錄到任何一個站點,我都可以去另一個站點並在沒有再次登錄的情況下開展業務。

我想知道的是這種場景背後的網站之間的一般交互機制。我使用的是Rails,但是我沒有在尋找代碼[1],只是一般的最佳實踐和指導,所以隨意用僞代碼或任何一般可讀的語言來回答。 OTOH,請記住,我的工具包中會有相當不錯的MVC,REST和元編程。


[1]:除非你知道現有的微小整齊免費MIT/BSD授權的應用/插件/發電機處理這個。

回答

1

這聽起來像你想實際使用OpenID協議本身。沒有理由不能限制身份驗證提供程序僅限於您自己的服務器,並執行一些使身份驗證過程透明的快捷方式。此外,OpenID協議支持您所描述的關於登錄到其中的一種意味着登錄到所有服務。

+0

是的,它看起來像這一點,我很樂意。但是有一個現有的用戶數據庫,以及一個客戶對依賴第三方系統的偏見。此外,這些將是支付帳戶,雖然我不認爲這在技術上很重要,但確實會影響客戶偏見的強烈程度。 – kch 2009-04-26 03:23:44

2

聽起來像(特別是強調無所事事),你想要的東西像維基媒體基金會正在做的事情。基本上,您登錄到en.wikipedia.org,然後該服務器與其他服務器通信(例如en.wikinews.org)並獲取身份驗證令牌。最後,這些令牌被嵌入到圖像中,例如, http://en.wikinews.org/wiki/Special:AutoLogin?token=xxxxxxxxxxxxxxx,當您的瀏覽器訪問該URL(img src)時,它將獲得維基新聞的身份驗證Cookie。當然,源代碼可以在http://www.mediawiki.org/wiki/Extension:CentralAuth處獲得。

OpenID也是一個不錯的選擇,但它確實需要用戶「有意識地」訪問兩個域。一個具有兩個域的實體的示例是Canonical。例如,如果您轉到https://help.ubuntu.com/community/UserPreferences,他們會將您重定向到Launchpad(https://login.launchpad.net/+openid)以進行身份​​驗證。

請注意,維基百科正在通過http執行此操作,但您可以通過https執行此操作,以確保img src令牌不會被攔截。