开发者社区> 科技小毛> 正文

京东SSO单点登陆实现分析

简介:
+关注继续查看
京东的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里信息的具体内容,这个验证过程也只有京东的开发人员才知道了。
 
http://blog.chinaunix.net/uid-25508399-id-3431705.html
 
 
本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/p/7234403.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20170 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
22248 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23538 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
13106 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
16594 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
22095 0
+关注
580
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载