1.阿里(淘寶、天貓、一淘)
1.1.登錄
淘寶:
在login.taobao.com登錄,請求與響應:
請求URI:https://login.taobao.com/member/login.jhtml?redirectURL=https%3A%2F%2Fwww.taobao.com%2F
響應:設置了一系列cookie
天貓:
打開天貓首頁 tmall.com,天貓用jsonp發出了如下請求來獲取淘寶的登錄狀態:
請求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,請求與響應如下:
請求URI:https://tmcc.tmall.com/pass.htm
響應:重定向到 https://login.taobao.com/jump?target=https%3A%2F%2Ftmcc.tmall.com%2Fpass.htm%3Ftbpm%3D1
淘寶的跳轉頁,請求與響應:
請求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接口,請求與響應:
請求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
請求URI:https://tmcc.tmall.com/pass.htm?tbpm=1
響應:重定向到 https://tmcc.tmall.com/pass.htm
請求URI:https://tmcc.tmall.com/pass.htm
響應:200 OK
一淘:
打開一淘首頁etao.com ,請求與響應:
重定向的請求與響應:
請求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.登出
淘寶:請求與響應:
請求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接口,請求與響應:
請求URI:https://login.taobao.com/clear
響應:清空了一系列taobao.com域名下的cookie,并且重定向到天貓的clear接口https://pass.tmall.com/clear
然后重定向到了天貓的clear接口,請求與響應:
請求URI:https://pass.tmall.com/clear
響應:清空了一系列tmall.com域名下的cookie,并且重定向到一淘的clear接口https://pass.etao.com/clear
然后重定向到一淘的clear接口,請求與響應:
請求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接口:
2.京東
2.1.登錄
在京東首頁jd.com點擊登錄跳轉到passport.jd.com,輸入用戶名密碼后,
jd.com 先調用如下接口進行登錄,請求與響應:
請求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登錄,請求與響應:
請求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為例,其他類似,中轉請求與響應:
請求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請求,請求與響應:
請求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登出,請求與響應:
請求URI:https://passport.jd.com/uc/login?ltype=logout
響應:返回的是一個頁面,其中使用jsonp方式請求了所有sso相關域名的退出登錄接口
我們以jcloud.com的退出登錄接口為例,其他類似,請求與響應:
請求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
})