阿里(淘寶、天貓、一淘)、京東SSO分析

1.阿里(淘寶、天貓、一淘)

1.1.登錄

淘寶:
在login.taobao.com登錄,請求與響應:

image.png
請求URI:https://login.taobao.com/member/login.jhtml?redirectURL=https%3A%2F%2Fwww.taobao.com%2F
響應:設置了一系列cookie

天貓:
打開天貓首頁 tmall.com,天貓用jsonp發出了如下請求來獲取淘寶的登錄狀態:

image.png
請求URI:https://top-tmm.taobao.com/login_api.do?0.2039105696809329
響應:
var userCookie = {
    _nk_: 'echo\u6C34\u58A8\u5929\u6DAF',
    _l_g_: 'Ug==',
    ck1: '',
    tracknick: 'echo\u6C34\u58A8\u5929\u6DAF',
    mt: 'ci=8_1',
    l: '',
    uc1: 'cookie14=UoTcCDvTII3clw==&lng=zh_CN&cookie16=UtASsssmPlP/f1IHDsDaPRu+Pw==&existShop=false&cookie21=W5iHLLyFe3xm&tag=8&cookie15=UtASsssmOIJ0bQ==&pas=0',
    t: '54d4381f630a665f5c2d4d264951e363',
    unb: '773451530',
    cna: 'I/blEe4MhCkCAbeDCzlbxeUx',
    _tb_token_: 'e5e51eeb8a385',
    version: '4.0.0'
};
window.TB && TB.Global && TB.Global.run && TB.Global.run();

然后用上述token經過幾次重定向在tmall.com域名下添加cookie,請求與響應如下:

image.png
請求URI:https://tmcc.tmall.com/pass.htm 
響應:重定向到 https://login.taobao.com/jump?target=https%3A%2F%2Ftmcc.tmall.com%2Fpass.htm%3Ftbpm%3D1 

淘寶的跳轉頁,請求與響應:

image.png
請求URI:https://login.taobao.com/jump?target=https%3A%2F%2Ftmcc.tmall.com%2Fpass.htm%3Ftbpm%3D1
響應:重定向到 https://pass.tmall.com/add?_tb_token_=3e6e15393e6b4&hng=CN%7Czh-CN%7CCNY%7C156&uc3=sg2=VyVZ8qGIa4%2Bfjx8zXEKvPjr7VqEps3bjv8sXAFOd%2BQo%3D;nk2=BvBeG4ibexX5RIpT;id2=VAYrHzp6i09D;vt3=F8dBzLBEdd2%2BsIDXxVI%3D;lg2=VT5L2FSpMGV7TQ%3D%3D&uss=UNlhxlMsFFHww8M65vgaUQwClOa35RX7T26wl7Om5CMpWoVGQjNHhGi7UQ%3D%3D&lgc=echo%5Cu6C34%5Cu58A8%5Cu5929%5Cu6DAF&tracknick=echo%5Cu6C34%5Cu58A8%5Cu5929%5Cu6DAF&cookie2=6bfaa4264bfbd64c1cecb0e0c4ef4fb6&sg=%E6%B6%AF0e&cookie1=UUtMSqnXd8yw9%2BtPEaOS27bYRhCjIk7P2aZUvYRnrtM%3D&unb=773451530&t=d63ed354b3285cd1acfa1af5d8a5f6f2&_l_g_=Ug%3D%3D&_nk_=echo%5Cu6C34%5Cu58A8%5Cu5929%5Cu6DAF&cookie17=VAYrHzp6i09D&uc1=cookie14=UoTcCDq4yDUHZw%3D%3D;lng=zh_CN;cookie16=VT5L2FSpNgq6fDudInPRgavC%2BQ%3D%3D;existShop=false;cookie21=W5iHLLyFe3xm;tag=8;cookie15=VFC%2FuZ9ayeYq2g%3D%3D;pas=0&login=true&tmsc=1507545732719000&opi=11.135.97.23&pacc=8jXxN7nnDgL-2D_Fdm4CWA==&target=https%3A%2F%2Ftmcc.tmall.com%2Fpass.htm%3Ftbpm%3D1

天貓的添加cookie接口,請求與響應:

image.png
請求URI:https://pass.tmall.com/add?hng=CN%7Czh-CN%7CCNY%7C156&_tb_token_=3e6e15393e6b4&uc3=sg2=VyVZ8qGIa4%2Bfjx8zXEKvPjr7VqEps3bjv8sXAFOd%2BQo%3D;nk2=BvBeG4ibexX5RIpT;id2=VAYrHzp6i09D;vt3=F8dBzLBEdd8TDNRU3hI%3D;lg2=VT5L2FSpMGV7TQ%3D%3D&uss=UNlhxlMsFFHww8M65vgaUQwClOa35RX7T26wl7Om5CMpWoVGQjNHhGi7UQ%3D%3D&lgc=echo%5Cu6C34%5Cu58A8%5Cu5929%5Cu6DAF&tracknick=echo%5Cu6C34%5Cu58A8%5Cu5929%5Cu6DAF&cookie2=6bfaa4264bfbd64c1cecb0e0c4ef4fb6&sg=%E6%B6%AF0e&cookie1=UUtMSqnXd8yw9%2BtPEaOS27bYRhCjIk7P2aZUvYRnrtM%3D&unb=773451530&t=d63ed354b3285cd1acfa1af5d8a5f6f2&_l_g_=Ug%3D%3D&_nk_=echo%5Cu6C34%5Cu58A8%5Cu5929%5Cu6DAF&cookie17=VAYrHzp6i09D&uc1=cookie14=UoTcCDq4zkLh2A%3D%3D;lng=zh_CN;cookie16=UtASsssmPlP%2Ff1IHDsDaPRu%2BPw%3D%3D;existShop=false;cookie21=UtASsssme%2BBq;tag=8;cookie15=U%2BGCWk%2F75gdr5Q%3D%3D;pas=0&login=true&tmsc=1507543693142000&opi=11.128.42.8&pacc=VZty6Wg87Nf6GL16A17dUQ==&target=https%3A%2F%2Ftmcc.tmall.com%2Fpass.htm%3Ftbpm%3D1
響應:在tmall.com域名下添加了一系列cookie,并且重定向到 https://tmcc.tmall.com/pass.htm?tbpm=1
image.png
請求URI:https://tmcc.tmall.com/pass.htm?tbpm=1
響應:重定向到 https://tmcc.tmall.com/pass.htm
image.png
請求URI:https://tmcc.tmall.com/pass.htm
響應:200 OK

一淘:
打開一淘首頁etao.com ,請求與響應:

image.png

重定向的請求與響應:

image.png
請求URI:https://login.taobao.com/jump?target=https%3A%2F%2Fh5api.m.etao.com%2Fh5%2Fmtop.etao.fe.hotwords%2F1.0%2F%3Ftbpm%3D1%26type%3Djsonp%26api%3Dmtop.etao.fe.hotwords%26v%3D1.0%26appKey%3D12574478%26data%3D%7B%2522count%2522%3A100%7D%26t%3D1507364596458%26sign%3D116f8ef8e61375c2606d282c855f18cf%26callback%3Djsonp12114677525268092
響應:重定向到https://pass.etao.com/add?_tb_token_=e5e51eeb8a385&uc3=sg2=VyVZ8qGIa4%2Bfjx8zXEKvPjr7VqEps3bjv8sXAFOd%2BQo%3D;nk2=BvBeG4ibexX5RIpT;id2=VAYrHzp6i09D;vt3=F8dBzWk3kitsFfSOXN4%3D;lg2=V32FPkk%2Fw0dUvg%3D%3D&uss=AV10vtl%2F6j3OY1i5OKVClYhVfgSDasMM8hQnKAqT8k3qn%2BrV3yInWBl9tg%3D%3D&lgc=echo%5Cu6C34%5Cu58A8%5Cu5929%5Cu6DAF&tracknick=echo%5Cu6C34%5Cu58A8%5Cu5929%5Cu6DAF&cookie2=72fe57b48013f6af584fa896a7262c48&sg=%E6%B6%AF0e&cookie1=UUtMSqnXd8yw9%2BtPEaOS27bYRhCjIk7P2aZUvYRnrtM%3D&unb=773451530&t=54d4381f630a665f5c2d4d264951e363&_l_g_=Ug%3D%3D&_nk_=echo%5Cu6C34%5Cu58A8%5Cu5929%5Cu6DAF&cookie17=VAYrHzp6i09D&uc1=cookie14=UoTcCDyT%2FONwBg%3D%3D;lng=zh_CN;cookie16=Vq8l%2BKCLySLZMFWHxqs8fwqnEw%3D%3D;existShop=false;cookie21=UIHiLt3xTIkz;tag=8;cookie15=UIHiLt3xD8xYTw%3D%3D;pas=0&login=true&tmsc=1507364596592000&opi=11.169.233.23&pacc=lTs9uCpA4tcx-TJaVeqP2A==&target=https%3A%2F%2Fh5api.m.etao.com%2Fh5%2Fmtop.etao.fe.hotwords%2F1.0%2F%3Ftbpm%3D1%26type%3Djsonp%26api%3Dmtop.etao.fe.hotwords%26v%3D1.0%26appKey%3D12574478%26data%3D%7B%2522count%2522%3A100%7D%26t%3D1507364596458%26sign%3D116f8ef8e61375c2606d282c855f18cf%26callback%3Djsonp12114677525268092
這個地址,在參數中帶上了淘寶登錄狀態的cookie,由重定向請求來在etao.com設置cookie

1.2.登出
淘寶:請求與響應:

image.png
請求URI:https://login.taobao.com/member/logout.jhtml?spm=a21bo.50862.754894437.7.129c2a48ASWd4Q&f=top&out=true&redirectURL=https%3A%2F%2Fwww.taobao.com%2F
響應:清空了一系列cookie

然后請求了淘寶的clear接口,請求與響應:

image.png
請求URI:https://login.taobao.com/clear
響應:清空了一系列taobao.com域名下的cookie,并且重定向到天貓的clear接口https://pass.tmall.com/clear

然后重定向到了天貓的clear接口,請求與響應:

image.png
請求URI:https://pass.tmall.com/clear
響應:清空了一系列tmall.com域名下的cookie,并且重定向到一淘的clear接口https://pass.etao.com/clear

然后重定向到一淘的clear接口,請求與響應:

image.png
請求URI:https://pass.etao.com/clear
響應:清空了一系列etao.com域名下的cookie,并且重定向到阿里旅行的clear接口https://pass.alitrip.com/clear

如此重復,下面還有若干個域名下的clear的調用,省略,最后個clear的響應碼是200,不再進行重定向。
附錄:從淘寶退出登錄后所有接力重定向的的clear接口列表

https://login.taobao.com/clear
https://pass.tmall.com/clear
https://pass.etao.com/clear
https://pass.alitrip.com/clear
https://pass.yao.95095.com/clear
https://pass.aliyun.com/clear
http://pass.koubei.com/clear
http://pass.im.alisoft.com/clear
http://pass.xiami.com/clear
http://pass.juhuasuan.com/clear
http://pass.tao123.com/clear
https://pass.alibaba.com/clear
https://pass.1688.com/clear

天貓:在天貓中退出登錄,調用的是淘寶的退登錄接口以及淘寶的clear接口:

image.png
image.png

2.京東

2.1.登錄

在京東首頁jd.com點擊登錄跳轉到passport.jd.com,輸入用戶名密碼后,
jd.com 先調用如下接口進行登錄,請求與響應:

image.png
請求URI:https://passport.jd.com/uc/loginService?uuid=51323086-8a92-4145-9823-320d08f225e8&ReturnUrl=https%3A%2F%2Fwww.jd.com%2F&r=0.12679261032413436&version=2015
響應:設置了登錄態的cookie

jd.com登錄成功后,由js發起jsonp請求進行了sso登錄,請求與響應:

image.png
請求URI:https://passport.jd.com/new/helloService.ashx?callback=jsonpCallbackHelloService&_=1507474971353
響應:
jsonpCallbackHelloService({
    "nick": "echo水墨",
    "sso": [
        "http://sso.jd.com/setCookie?t=sso.jcloud.com&callback=?",
        "http://sso.jd.com/setCookie?t=sso.jd.hk&callback=?",
        "http://sso.jd.com/setCookie?t=sso.yiyaojd.com&callback=?",
        "http://sso.jd.com/setCookie?t=sso.jdpay.com&callback=?",
        "http://sso.jd.com/setCookie?t=sso.baitiao.com&callback=?"
    ],
    "info": "<a href=\"http://home.jd.com\" target=\"_blank\" class=\"link-user\">echo水墨</a>  <a href=\"https://passport.jd.com/uc/login?ltype=logout\" class=\"link-logout\">退出</a>"
})

然后由js根據上述返回結果,以sso.jd.com作為中轉站,依次向上述返回結果sso字段中包含的域名發起跨域jsonp請求,以其中向jcloud.com域名設置cookie為例,其他類似,中轉請求與響應:

image.png
請求URI:https://sso.jd.com/setCookie?t=sso.jcloud.com&callback=jQuery1059723&_=1507474971464
響應:重定向到 https://sso.jcloud.com/sign?c=2fd1f7303e1f65fab3a2da0940c5296405e13a4659e54b726f3b4058847fa15dbe6622b3cb8d0ef6fe71547a8b7252b1274ead1d622b6e43a67b4d720b01d948fe6e0fbaa067b2ab449f92a7724a916d7265e41903b9da6c812d5955b33d1935697328317e4d76621efc9949a5953f9760f86945d87cc9bf78dc470c6b4e2fa9e7b62f51b1b763c62b67ecf9d9522d6083610bfd14edcffde5934d1845583f76253ee8671cf8c472cfb6e2cf1be78b6e29b2dd24958ec437d41332ac0476b8fe7299a75c2c45d2b3e4d3dc5228387ad4e3ceef9683e2642eb10af55bc09b1919855b559451881ca06fe110b9bf6fe9591d1265e215240822bb9578d0ff4acb67b1781d266ee548bd&callback=jQuery1059723&_=1507474971464&t=1507474973128&pin=echo%E6%B0%B4%E5%A2%A8&unick=echo%E6%B0%B4%E5%A2%A8
在參數中帶了jd.com下的登錄狀態cookie以及callback參數,是一個jsonp請求

我們再來看看上述重定向URI,它是一個由jd.com向jcloud.com發起的跨域jsonp請求,請求與響應:

image.png
請求URI:https://sso.jcloud.com/sign?c=2fd1f7303e1f65fab3a2da0940c5296405e13a4659e54b726f3b4058847fa15dbe6622b3cb8d0ef6fe71547a8b7252b1274ead1d622b6e43a67b4d720b01d948fe6e0fbaa067b2ab449f92a7724a916d7265e41903b9da6c812d5955b33d1935697328317e4d76621efc9949a5953f9760f86945d87cc9bf78dc470c6b4e2fa9e7b62f51b1b763c62b67ecf9d9522d6083610bfd14edcffde5934d1845583f76253ee8671cf8c472cfb6e2cf1be78b6e29b2dd24958ec437d41332ac0476b8fe7299a75c2c45d2b3e4d3dc5228387ad4e3ceef9683e2642eb10af55bc09b1919855b559451881ca06fe110b9bf6fe9591d1265e215240822bb9578d0ff4acb67b1781d266ee548bd&callback=jQuery1059723&_=1507474971464&t=1507474973128&pin=echo%E6%B0%B4%E5%A2%A8&unick=echo%E6%B0%B4%E5%A2%A8
響應:jQuery4048887('{"result":"success"}'),并且設置了一系列cookie,包含參數中的unick,pin和一個新的thor,應該是通過參數中的c在jcloud.com中換的

2.2.登出
在jd.com登出,請求與響應:

image.png
image.png
請求URI:https://passport.jd.com/uc/login?ltype=logout
響應:返回的是一個頁面,其中使用jsonp方式請求了所有sso相關域名的退出登錄接口

我們以jcloud.com的退出登錄接口為例,其他類似,請求與響應:

image.png
請求URI:https://sso.jcloud.com/exit?callback=jQuery1251057&_=1507476365021
響應:jQuery1251057('{"result":"success"}');

附錄:
1.天貓jsonp調用 login_api 相關js代碼:

e._seedLoginApi(function() {
    i.userInfo.status = "success",
    a.nick = H(unescape(userCookie._nk_.replace(/\\u/g, "%u"))),
    a.tracknick = H(unescape(userCookie.tracknick.replace(/\\u/g, "%u"))),
    a.isLogin = !(!userCookie._l_g_ || !a.nick),
    a.trackId = userCookie.t || "",
    a.unb = userCookie.unb || "",
    a.uc1 = userCookie.uc1 || "",
    a.cookie2 = userCookie.cookie2 || "",
    a.tbToken = userCookie._tb_token_ || "";
    var n = o.unparam(a.uc1);
    if (a.isMallSeller = !!n.tmb, a.tag = n.tag, a.isLogin && (a.nick != t || !a.tbToken)) {
        var l = "http://tmcc.tmall.com/pass.htm";
        g && (l = "http://tmcc.daily.tmall.net/pass.htm"),
        E(l)
    }
    e._fireLoginStatusReadyFnList()
},
function() {
    i.userInfo.status = "error",
    e._fireLoginStatusReadyFnList()
})
},
"_seedLoginApi": function(e, a) {
    var t = "http://top-tmm.taobao.com/login_api.do";
    g && (t = "http://www.daily.taobao.net/go/app/tmall/login-api.php"),
    t += "?" + Math.random(),
    o.getScript(t, {
        "success": e,
        "error": a,
        "timeout": 3
    })
},
"_fireLoginStatusReadyFnList": function() {
    if (!i._isLoginStatusReady && (i._isLoginStatusReady = !0, i._loginStatusReadyFnList)) {
        for (var e = 0; e < i._loginStatusReadyFnList.length; e++) i._loginStatusReadyFnList[e].call(d, i.userInfo);
        i._loginStatusReadyFnList = []
    }
},

2.京東SSO相關相關js代碼:

define('//misc.360buyimg.com/jdf/1.0.0/unit/setUserInfo/3.0.0/setUserInfo.js', [],
    function () {
        var c = function (global) {
            // 為jQuery添加靜態方法
            global = $.extend({
                    el: $('#loginbar,#ttbar-login'),
                    callback: null
                },
                global || {})
            var reqProtocol = function () {
                return 'https:' === document.location.protocol ? 'https://' : 'http://'
            }
            $.ajax({
                url: reqProtocol() + 'passport.jd.com/new/helloService.ashx',
                dataType: 'jsonp',
                scriptCharset: 'GBK',
                success: function (helloResp) {
                    if (!helloResp) {
                        return !1
                    }
                    helloResp.info && global.el.html(helloResp.info)  // 在loginbar填充登錄用戶信息
                    var callCallback = function () {
                        clearTimeout(d), // 取消由 setTimeout 設定的timeout
                        $.isFunction(global.callback) && global.callback(helloResp),
                            callCallback = $.noop // 賦值為空函數
                    }
                    var d = setTimeout(function () {
                        callCallback()
                    }, 2000)
                    // "sso": [
                    //     "http://sso.jd.com/setCookie?t=sso.jcloud.com&callback=?",
                    //     "http://sso.jd.com/setCookie?t=sso.jd.hk&callback=?",
                    //     "http://sso.jd.com/setCookie?t=sso.yiyaojd.com&callback=?",
                    //     "http://sso.jd.com/setCookie?t=sso.jdpay.com&callback=?",
                    //     "http://sso.jd.com/setCookie?t=sso.baitiao.com&callback=?"
                    // ],
                    if (helloResp.sso) {
                        $.each(helloResp.sso, function (index, ssoURI) {
                            $.getJSON(ssoURI).complete(function () {
                                callCallback() // sso成功后調用callback
                            })
                        })
                    } else {
                        callCallback()
                    }
                }
            })
        }
        return c
    })

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,829評論 25 708
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • 原文出處:單點登錄原理與簡單實現 一、單系統登錄機制 1、http無狀態協議 web應用采用browser/ser...
    程式怪客閱讀 1,505評論 2 24
  • 1. 什么叫內心不夠強大 以前總覺得自己不是一個內心強大的人。 小時候的自己,內向又害羞,特別“愛面子”。 幼兒園...
    墨尓兮閱讀 577評論 0 0
  • 生下來,活下去!這是人們對生活最初的定義。可怎么活? 為什么在人生的道路上有人歡喜,有人憂愁呢……心境!
    Devil梁紅閱讀 222評論 0 1