近日研究了 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, 至此,登陸過程完成。
未完。。。。