我在不同領域的幾個網站:example.com
,example.org
,mail.example.com
和passport.example.org
。所有這些網站都有共同的外觀和感覺,並且 應該共享相同的用戶羣。透明的用戶會話(單點登錄+單簽收)
,在這種極端情況下我還是希望所有的網站透明(儘可能) 共享用戶會話具有以下關鍵特性:
單點登錄。當在
passport.example.org
用戶登錄和訪問 任何其他網站 - 他應該被視爲登錄登錄用戶得到「你好,
$username
「問候在網站標題和不同 導航菜單,列出的服務,他們有機會獲得。 。如果他沒有登錄,而是 的問候有「登錄」鏈接,指向passport.example.org/signon
。已知可信域列表,因此使用OpenID或使用一些自制輕量級協議實現 相當簡單。當用戶第一次點擊 網站時,我將他重定向到特殊的身份驗證端點
passport.example.org
, ,然後悄悄地將他重定向回來,其中包含身份信息(或「未簽名」 匿名身份)。對於大多數瀏覽器,這是完全透明的。 顯然,我使用nonce值來對抗重定向循環。單次簽收。當用戶在下次訪問任何網站時在任何網站 的標題中單擊「簽出」時,應將其視爲「未登錄」。
OpenID不是爲此設計的。我目前的想法(我已經有一個部分工作的實現) 實施)是發送不是用戶身份,而是發送「全局」會話令牌並在DB中共享全局會話表(global_session_token↔用戶關係)。
機器人和無Cookie用戶支持。網站有公共區域,用戶代理應該可以訪問 ,而不需要任何cookie支持。因爲這個原因,我在(1)中提到的重定向成爲一個問題,因爲對於每個單頁請求的 ,我最終會將user-agent引發到auth端點並返回。 這不僅會讓機器人感到困惑,而且會非常迅速地污染我的會話數據庫,其中包含 死亡會話。我絕對不想顯示「嘿, 你沒有啓用cookies,走開!」頁面,這是非常粗魯和 令人失望。雖然我需要Cookie支持才能登錄,但我希望用戶可以自由閱讀 網站的內容,等等 - 沒有任何限制。
而且我明確地要求不要想要將會話ID放在URL中,除了我提到的一些透明的 跨域重定向。我相信這樣做是一個安全問題 ,通常只是一件壞事。
在這裏,我幾乎沒有想法。
好吧,我知道這很難,但谷歌實際上這是否在某種程度上(google.com
, google.
批次的-gTLD的,gmail.com
等),對不對?所以這應該是 可能的。
我會爲任一協議描述的想法感激(這會是最好的),或者鏈接到 系統(或者代碼來讀取或只是住的網站觀看和學習時)已經 成功地實施這樣的事情。
總結:幾個域沒有共同的根,共享的用戶羣,單點登錄,單點登錄,沒有cookie需要匿名瀏覽。
所有的站點都在同一個網絡上(但在不同的服務器上),部分共享相同的PostgreSQL數據庫(在同一數據庫的不同方案中)。 大多數站點都是用Python/Django編寫的,但其中一些站點使用PHP和Ruby on Rails。當我想到框架和語言不可知的東西時,我很感激指向任何實現。即使我不能使用它們,如果我能夠明白它是如何完成的,那麼我可能會實現類似的東西。
不,這並不難。這只是一個竅門,就像卡牌一樣。一旦你知道如何,這很容易。 :-) – 2009-06-25 11:21:18