京東的sso流程:javascript
初始訪問狀態:html
cookies:java
http請求:ajax
1.在首頁點擊登錄,跳轉至passport.360buy.com,給予驗證cookie alc(能夠試試在提交登錄信息前刪除該cookie)json
cookies跨域
http請求數組
2.填寫用戶名密碼,提交登錄,驗證alc,登錄成功則給予sso的cookie ceshi3.com,跳轉至首頁服務器
cookies:cookie
3.首頁異步ajax,向passport.360buy.com發起hello請求,hello請求返回json對象a,a包含sso(url地址數組,含請求參數)網絡
http請求:
發起hello請求的腳本以下:
點擊(此處)摺疊或打開
【以上這段是在登出頁發現的,京東首頁實際使用的是壓縮過的,來自http://misc.360buyimg.com/lib/js/2012/lib-v1.js?t=20121204的腳本,二者相同】
a.sso的內容
"http://sso.360buy.com/setCookie?t=sso.360top.com&callback=?"
"http://sso.360buy.com/setCookie?t=sso.minitiao.com&callback=?"
"http://sso.360buy.com/setCookie?t=sso.ehaoyao.com&callback=?"
"http://sso.360buy.com/setCookie?t=sso.jcloud.com&callback=?"
"http://sso.360buy.com/setCookie?t=sso.qianxun.com&callback=?"
4.客戶端回調函數,遍歷a.sso,逐個發起getjson 請求(此時請求目標仍是在同一個主域名下,firebug網絡面板中setcookie系列請求,以下圖),
相關代碼: $.each(a.sso, function () { $.getJSON(this) })
http請求:
5.setcookie系列請求,各自響應一個與setcookie所接受的t參數相應域名的jsonp請求地址(便是接下來的跨域請求),幷包含統一的一個c參數
*5到6的銜接,猜想是setcookie的響應同時觸發了sign系列的請求,那必須返回一個js代碼片斷,發起getjson請求。
6.客戶端發起sign系列請求,包含c參數,跨主域名請求,響應即爲設置ceshi3.com cookie
http://sso.360top.com/sign? c=6d324d99805593c4aac6abfdd17e67399d73......54763628040
http://sso.minitiao.com/sign?c=6d324d99805593c4aac6abfdd17e67399d73......54763628040
http://sso.jcloud.com/sign? c=6d324d99805593c4aac6abfdd17e67399d73......54763613889
http://sso.ehaoyao.com/sign? c=6d324d99805593c4aac6abfdd17e67399d73......54763613889
http://sso.qianxun.com/sign? c=6d324d99805593c4aac6abfdd17e67399d73......54763613890
(上面省略的部分包含了相似「48bd&callback=jsonp1354763638164&_=1354763638814&t=1354763」)
7.全部京東涉及登錄信息的頁面,可對ceshi3.com cookie進行解析,以此做爲登錄憑證。
**能夠驗證一下
登錄京東後,打開京東奢侈品(360top),刪除cookie ceshi3.com 刷新後顯示未登錄,再打開京東迷你挑(此時又同步了一次cookie),再回京東奢侈品(360top),刷新後依舊是登錄狀態。(迷你挑測試中偶爾會有 問題,能夠換一個京東產品試試)
8.退出時,跳轉到登出頁面,JS發起getjson請求,刪除全部cookie
京東登出頁上找到如下代碼
點擊(此處)摺疊或打開
總結,總體的關鍵在於360buy.com下客戶端js發起jsonp跨域請求時,傳遞的參數c(猜想是對稱加密後的數據,與登陸憑據cookie ceshi3.com 的值有對應關係)。其餘細節都在於服務器端對各系列請求的處理。
若是A域名和B域名(指主域名不一樣的狀況)要共享登錄
B域名下的cookie仍是要B本身寫的,jsonp的處理就是告訴B,該寫個什麼值,固然傳遞過程當中最好進行加密(上面的參數c)。當ABCD等等各產 品都設置了統一的憑據,那麼就完成了「單點登錄」的要求。不過,對這個憑據進行解析的需求也是很重要的,這裏倒未說起。由於涉及到ceshi3.com這 個cookie裏信息的具體內容,這個驗證過程也只有京東的開發人員才知道了。