Chinaunix首页 | 论坛 | 认证专区 | 博客 登录 | 注册

personball的ChinaUnix博客personball.blog.chinaunix.net

文章将陆续转移到  http://personball.com

  • 博客访问: 361769
  • 博文数量: 41
  • 博客积分: 1046
  • 博客等级: 准尉
  • 技术积分: 895
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-10 16:50
文章分类

全部博文(41)

文章存档

2013年(8)

2012年(33)

微信关注

IT168企业级官微



微信号:IT168qiye



系统架构师大会



微信号:SACC2013

订阅
热词专题
友情链接
京东SSO单点登陆实现分析 2012-12-06 13:22:44

分类: Web开发

京东的sso流程:
初始访问状态:
cookies:
http请求:

1.在首页点击登陆,跳转至passport.360buy.com,给予验证cookie alc(可以试试在提交登陆信息前删除该cookie
cookies

http请求

2.填写用户名密码,提交登陆,验证alc,登陆成功则给予sso的cookie ceshi3.com,跳转至首页
cookies:

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里信息的具体内容,这个验证过程也只有京东的开发人员才知道了。




阅读(75462) | 评论(4) | 转发(1) |
给主人留下些什么吧!~~

tolerious2016-08-08 17:46:03

貌似现在京东的策略发生了变化,  测试了下现在的京东。

张德德2015-05-24 22:12:21

一般可以采用类似于Memcached的分布式缓存的方案,高效存储大量临时性的信任数据。对于防止信息传递过程被篡改,一般采取数字签名的方法,要么通过数字证书签名,要么通过像md5的方式,这就需要SSO系统返回免登URL的时候对需验证的参数进行md5加密,并带上token一起返回,最后需免登的系统进行验证信任关系的时候,需把这个token传给SSO系统,SSO系统通过对token的验证就可以辨别信息是否被改过。
还可以通过白名单来处理,只有在白名单上的系统才能请求生产信任关系,同理只有在白名单上的系统才能被免登录。

idsmanager2015-05-14 14:57:17

我们团队有高可靠、高并发的单点登陆系统解决方案,有兴趣的朋友请与我联系email xj@idsmanager.com

bench12015-02-11 17:29:09

因为开发人员知道对称加密的key,出现伪造cookie的情况,怎么办啊?

评论热议
请登录后评论。

登录 注册