管理用戶網站javascript
用戶帳戶網址:http://accounts.com 用戶登陸網址:http://accounts.com/login 用戶等處網址:http://accounts.com/logoutphp
應用網站 應用1:http://app1.com 應用2:http://app2.comjava
實現場景 登陸 應用1,跳轉到 http://accounts.com/login 進行登陸 登陸成功跳轉 迴應用1,地址後面會帶個token,例如:http://app1.com/callback?token=xxxx 來驗證登陸 瀏覽了 應用1 後,用戶進入 應用2 (用戶可能會本身輸入 app2.com 的地址訪問 應用2) 此時 應用2 經過「某種方式」來判斷以前 應用1 的登陸與否,來設置當前用戶是否登陸json
問題是如何實現場景中的 第4條?api
我如今想到的是: 同步登陸:像 discuz 那樣,在登陸一個應用時對其它應用進行同步登陸,缺點是登陸後最好是等個幾秒在跳轉使其它應用可以有足夠時間寫下 cookie,可是我不喜歡「要等幾秒」的方式 使用 jsonp:雖然知道怎麼用 jsonp 進行跨域請求,可是實現起來有些困難,並且處理很差就有安全問題跨域
不知各位有什麼好的方法???瀏覽器
----------------------- 華麗的分割線 --------------------------- 下午花了點時間分別研究了一下兩組網站的登陸方式:安全
google.com 和 youtube.com taobao.com 和 etao.comcookie
1、 google.com 和 youtube.com 狀況一:都未登陸,可是瀏覽過 youtube 登陸 google.com 經過 https://accounts.google.com/ServiceLoginAuth 驗證用戶名密碼 經過驗證後跳轉到 https://accounts.google.com/CheckCookie 檢查是否有瀏覽過其它應用,好比說 youtube,這時就再次跳轉到 https://accounts.youtube.com/accounts/SetSID 進行登陸 最後再跳回 google.com 的首頁app
狀況二:已登陸 google.com,但未瀏覽過 youtube 也並未登陸 因爲登陸了 google.com 因此我直接從地址欄裏輸入地址進行第一次訪問 youtube 進入 youtube 首頁顯示的是我須要登陸,故點擊登陸 依然跳轉到 https://accounts.google.com/ServiceLoginAuth,可是不用任何輸入直接跳回 yutube 首頁
2、 taobao.com 和 etao.com 無論我有沒有登陸 taobao.com,我進入 etao.com 首頁,首先會檢查 cookie 是否登陸 登陸則 etao.com 首頁顯示登陸狀態 未登陸則跳轉到 http://jump.taobao.com/jump?target=http%3A%2F%2Fwww.etao.com%2F%3Ftbpm%3Dt 來檢查在 taobao.com 是否有登陸 登陸則跳回 http://pass.etao.com/add?... 進行登陸後在跳回首頁,登陸狀態爲登陸 未登陸則依然跳回首頁,登陸狀態爲未登陸 如今基本知道怎麼去作了,或者有其它更好方法的?說出來你們討論一下……
答案以下: 研究並看過sohu的,拿出來分享。
統一在 login.common.com?return=www.a.com 登陸,(帶須要返回的地址) if 驗證成功 return js,在login.common.com/success 加入返回的JS,並顯示,而後跳回 return 參中帶的值。
那麼這段JS內容是什麼樣的呢? 就是經過JS的方式調用各個站點,生成各自的cookie。
目前 ucenter 也是採用這種方式。 登陸中心,應該要有一個相似應用列表這樣的東西。
連接
willerce1.6k 2011年10月24日回答 0回覆 joyqi · 2011年10月24日
我知道的有下面三種方法:
下面是詳細:
<script type="text/javascript" src="http://app2/api/uc.php?time=132 4695020&code=f97bp%2FyiCrfFF%2B4lIndT1k3PoVk5%2BmVvNJMYiBzq7ssWE8FS smj7T3jujWyDpKpT2t8vO7o5M19FlzvNdihXMDWqvyoko9C3lkpG%2BQX57zL112gb GH%2FPwS9YD9A3%2BQVKNFSDzriFOqq9IFWJx6q4x%2Fk%2FMAltJygTiwRZ" reload="1"></script>
<script type="text/javascript" src="http://app3/api/uc.php?time=1324 695020&code=2b55qIaEphMxdvEYZJok8GEoDW%2BctvZeWS84LvaH8MHf8AzrRXiLD ZFIvS4cmUkXAGGeDnSVQ9rsu62iDnSAUSTEdSH2%2Bup5xZFvtgl9KRMEcOLLySih2w vNL%2BSjRQgqErT5kEK0878zxlhRQn0ypgxXgmoCY3zE87sy" reload="1"></script>
注意的是, uc.php 須要 p3p header
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'); 2. app1, app2, app3, 用戶請求 app1 登陸, app1 程序在驗證經過的時候讓帶着參數讓瀏覽器跳到 app2.com (在輸出頁面的時候加上一段js, 代碼相似下面), 而後再跳到 app3.com ... 依次種上 cookie 最後跳回 app1.com
<script type="text/javascript" reload="1">window.location.href=\'app1.com /loginAuth.phpcode=ctvZeWS84LvaH8MHf8AzrRXiLDZFIvS4cmUkXAGGeDnSVQ9rsu62i DnSAUSTEdSH2%2Bup5xZFvtgl9KRMEcOLLySih2wvNL%2BSjRQgqErT5kEK0878zxlhRQn0yp gxXgmoCY3zE87s'\';</script>
壞處是 - 在用戶看起來, 頁面會有好一下子的白屏! 不適合多個應用.
3 . Google 的方法, 壞處是用戶得主動的點擊登陸按鈕, 無法作到無縫的同步登陸, 好處是適合多個應用;
哪個好, 得看什麼要求, 若是不須要作到無縫的同步登陸的話, 確定是使用 Google 的方案!
google的這個辦法應該是一個比較完整的流程了,可是仍是有些缺點,那就是在我沒有訪問youtube的時候登陸了google,它沒有給我自動登陸到youtube,還須要你手動點擊登陸。雖然不用輸入密碼啥的,但也有些麻煩。
其實能夠作一個改進,就是你在youtube裏掛一個google域的js,固然這個js其實是經過動態腳本輸出的。咱們在腳本里先檢查用戶時候已經在google域裏登陸過了,若是已經登陸,那麼就動態輸出讓它在youtube域裏也登陸的js。
這個好處雖然只省了一步,其實是把你在問題中的第一種方法寫cookie的時間分散到訪問各個子站去完成,可讓用戶幾乎感受不到。
連接
joyqi6.2k 2011年10月04日回答 添加評論