2010-03-29 224 views
0

我有2個站點:example.com和exampletwo.com身份驗證和登錄2網站

我想,當在example.com用戶登錄,然後他自動身份驗證也對exampletwo.com

我怎樣才能做到這一點 ? 我在第一個網站上使用Django + Nginx,在第二個網站上使用Tornado framework + Tornado服務器。

謝謝;)

P.S.如果你不知道這個平臺(Django或Tornado或Nginx),我也接受一個通用的PHP + Apache平臺的解決方案,然後我會做一些研究:)

回答

1

我想讓代碼處理用戶註冊example.com立即發送https請求到exampletwo.com(當然,它基於證書對其進行認證),意思是「添加此用戶與這些憑據」。對於任何兩個Web服務器/框架/語言來說,這種方法似乎都可行,只要它們能夠發送和接收HTTPS請求並驗證證書即可。

如果您無法對證書進行身份驗證,則可以發送加密的「添加此用戶」消息(只要這兩個站點可以共享一個用於加密的密碼)。這可能容易受到重播攻擊,但如果您在「添加此用戶」消息中添加時間戳部分,則可以高度限制重放攻擊的漏洞時間窗口,可能足以使此方法可行。

如果您不能在兩個站點之間安全地共享祕密,則不會丟失所有內容:您仍然可以使用公鑰註冊。發送者用它自己的私鑰加密「添加此用戶消息」(包括課程的時間戳),然後用接收者的公鑰加密;接收方用自己的私鑰解密接收到的內容,然後用發送方的公鑰解密。有點混亂,也許有點慢,但在如此困難的限制下,令人驚訝的是它仍然可以完成;-)。

0

假設兩個網站都可以訪問單個共享數據庫,則可以使用訪問表的兩個網頁並檢查用戶是否已登錄。我不熟悉Djano或Tornado,但是如果上述解決方案是可疑的,您可能希望公開一個網站的Web方法(Web服務),然後使用(調用)另一個網站的方法。 餅乾是站不住腳的,因爲它們依賴於網站。 另一種方法是通過IP跟蹤用戶,但動態IP可能會造成很大的問題,可能會被用來破壞安全。

0

問題是,一個網站無法爲其他設置Cookie。即使您在example.com上的登錄代碼是通過服務器到服務器的請求來告訴exampletwo.com用戶已驗證,但當用戶實際訪問exampletwo.com時,無法設置Cookie來攜帶此消息。

客戶端證書是解決這個問題的方法,但是如果這個雙重身份驗證系統是面向大衆的,並不是特別好。大多數人會看到一些奇怪的請求('你想添加這個證書嗎?')彈出並跑到山尖叫。

解決方法是讓example.com吐出SOMETHING,這會導致用戶從exampletwo.com加載某些內容。一個圖像,一大塊javascript等等,並在請求中加入一個加密的標記(<img src="http://exampletwo.com/login.php?remoteauth=ENCRYPTEDTOKEN">)。然後exampletwo可以解密令牌,如果它的內容正常,併發送圖像(或任何你正在傳輸的)與適當的cookie集。