近日研究了 Sina CAS 的登陸過程,發現其實 sina 的 sso 實現了 yale-CAS 且增加一丁點新的東西,而基本認證流程互動流程仍不變。其獨創的一點是實現了 Ajax 單點登陸,算是比較牛隻。實作原理是 iframe+ javaScript 回呼函數。
一,初級 SSO
初級的 SSO ,就是在同一個頂級域名下,透過種入頂級域名的 Cookie ,來實現統一登陸。例如:
單點登陸網址: sso.xxx.com/login.jsp
應用 1 : web1.xxx.com/login.jsp
應用 2 : web. : web3.xxx.com/login.jsp
登陸流程:
情況一:(使用者從未登陸)
1, 使用者造訪 web1.xxx.com/login.jsp , web1 使用者造訪 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 的 tokenxxx.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/ssogin/login.php? (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, 至此,登陸程序完成。
重點:互動過程與密碼加密演算法分析。