近日研究了 Sina CAS 的登陸過程,發現其實 sina 的 sso 實現了 yale-CAS 並且添加一丁點新的東西,基本認證過程互動流程仍然未變。其獨創的一點是實現了 Ajax 單點登陸,算是比較牛。實現原理是 iframe+ javaScript 回呼函數。
一,初級 SSO
初級的 SSO ,就是在同一個頂級網域名稱下,通過種入頂級網域名稱的 Cookie ,來實現統一登陸。例如:
單點登陸地址: sso.xxx.com/login.jsp
應用 1 : web1.xxx.com/login.jsp
應用 2 : web2.xxx.com/login.jsp
應用 3 : web3.xxx.com/login.jsp
登陸流程:
情況一:(使用者從未登陸)
1, 使用者訪問 web1.xxx.com/login.jsp , web1 重新導向到 sso.xxx.com/login.jsp
2, 使用者輸入驗證,成功。 sso.xxx.com 種入 .xxx.com 域 Cookie 的 tokenid ,重新導向到 web1.xxx.com/login.jsp, web1.xxx.com 訪問 .xxx.com 域 Cookie 的 tokenid 判斷出已經登陸,系統登陸完成。
情況二:(使用者已經登陸)直接登陸。
二, Sina SSO
Sina 實現了跨網域名稱的統一登陸,本質也是基於 Cookie 的。如果使用者禁用 Cookie ,那麼無論如何也是登陸不了的。例如: Sina SSO 伺服器是 login.sina.com.cn/sso/login.php
,微博登陸地址為 weibo.com/login.php 。通過回呼函數和 iframe 實現了跨頂層網域的登陸。
認證過程具體流程:這裡只介紹使用者從未登陸過。
1, 使用者進入 weibo.com/login.php
2, 使用者輸入使用者名稱稱。輸入完畢後,當使用者名稱輸入框焦點失去的時候,頁碼通過 ajax 向伺服器login.sina.com.cn/sso/prelogin.php 發送請求,參數為 user (剛剛輸入的使用者名稱)。服務返回 server time 和nonce 認證,通過回呼函數寫入到 javascript 變數中。
3, 使用者輸入密碼,點擊登陸,頁面 POST 請求(注意是 ajax 請求,並不是 login.php 發送的 ),
login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.12) ,請求的發起的頁面是 weibo.com/login.php 中的一個不可見 iframe 頁面,參數為第二步得到的 server time 和 nonce ,已經使用者名稱稱和加密的密碼。返回種入Cookie tgt 在 login.sina.com.cn 下。同時修改 iframe 地址為 weibo.com/ajaxlogin.php?ticket=XXXXXX, 注意ticket 非常重要,這是使用者登陸和服務的憑證。
4, iframe 訪問 weibo.com/ajaxlogin.php?ticket=XXXXXX ,使用者登陸,返回種入 cookie 在 .weibo.com 下,記錄使用者登陸資訊。
5, 通過 js 再次訪問 weibo.com/login.php ,因為 cookie 已經寫入,登陸成功,伺服器發送 302 ,重新導向到使用者首頁面。 Weibo.com/userid 。
6, 至此,登陸過程完成。
重點:互動過程和密碼密碼編譯演算法分析。