京東SSO單點登錄實現分析

京東的sso流程:javascript

初始訪問狀態:html

cookies:java

http請求:ajax

 

1.在首頁點擊登錄,跳轉至passport.360buy.com,給予驗證cookie alc(能夠試試在提交登錄信息前刪除該cookiejson

cookies跨域

 

http請求數組

 

2.填寫用戶名密碼,提交登錄,驗證alc,登錄成功則給予sso的cookie ceshi3.com,跳轉至首頁服務器

cookies:cookie

 

3.首頁異步ajax,向passport.360buy.com發起hello請求,hello請求返回json對象a,a包含sso(url地址數組,含請求參數)網絡

http請求:

發起hello請求的腳本以下:

點擊(此處)摺疊或打開

  1. <script type="text/javascript">
  2.                     (function ($) {
  3.                         $("#shortcut .menu").Jdropdown({ delay: 50 });
  4.                         var helloUrl = window.location.protocol + "//passport.360buy.com/new/helloService.ashx?m=ls";
  5.                         jQuery.ajax({ url: helloUrl,
  6.                             dataType: "jsonp",
  7.                             scriptCharset: "gb2312",
  8.                             success: function (a) {
  9.                                 //if (a && a.info) { $("#loginbar").html(a.info); }
  10.                                 if (a && a.sso) {
  11.                                     $.each(a.sso, function () { $.getJSON(this) })
  12.                                 }
  13.                             }
  14.                         });
  15.                     }
  16.                       )(jQuery);</script>

【以上這段是在登出頁發現的,京東首頁實際使用的是壓縮過的,來自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

京東登出頁上找到如下代碼

 

點擊(此處)摺疊或打開

  1. <script type="text/javascript">
  2. jQuery.getJSON("http://sso.360top.com" + "/exit?callback=?");
  3. jQuery.getJSON("http://sso.qianxun.com" + "/exit?callback=?");
  4. jQuery.getJSON("http://sso.ehaoyao.com" + "/exit?callback=?");
  5. jQuery.getJSON("http://sso.360buy.com" + "/exit?callback=?");
  6. jQuery.getJSON("http://sso.minitiao.com" + "/exit?callback=?");
  7. jQuery.getJSON("http://sso.jcloud.com" + "/exit?callback=?");
  8. </script>

 

 

總結,總體的關鍵在於360buy.com下客戶端js發起jsonp跨域請求時,傳遞的參數c(猜想是對稱加密後的數據,與登陸憑據cookie ceshi3.com 的值有對應關係)。其餘細節都在於服務器端對各系列請求的處理。

若是A域名和B域名(指主域名不一樣的狀況)要共享登錄

B域名下的cookie仍是要B本身寫的,jsonp的處理就是告訴B,該寫個什麼值,固然傳遞過程當中最好進行加密(上面的參數c)。當ABCD等等各產 品都設置了統一的憑據,那麼就完成了「單點登錄」的要求。不過,對這個憑據進行解析的需求也是很重要的,這裏倒未說起。由於涉及到ceshi3.com這 個cookie裏信息的具體內容,這個驗證過程也只有京東的開發人員才知道了。

相關文章
相關標籤/搜索