论坛首页 Java企业应用论坛

新浪微博如何实现 SSO 的分析

浏览 44433 次
该帖已经被评为精华帖
作者 正文
   发表时间:2011-05-11  
呵呵。新浪动作真快,现在的sso不是你这种模式咯。
是采用P3P协议,t.sina.com.cn登录成功的话,会自动让用户请求一次weibo.com的http://weibo.com/sso/crosdom?action=login&savestate=1305728014&callback=sinaSSOController.doCrossDomainCallBack&scriptId=ssoscript0&client=ssologin.js(v1.3.12)&_=1305123230285 脚本设置COOKIE
0 请登录后投票
   发表时间:2011-05-11  
sso 普遍是基于cookie,一个统一的认证中心来负责维护认证这个cookie。
0 请登录后投票
   发表时间:2011-05-12   最后修改:2011-05-12
aweber 写道
呵呵。新浪动作真快,现在的sso不是你这种模式咯。
是采用P3P协议,t.sina.com.cn登录成功的话,会自动让用户请求一次weibo.com的http://weibo.com/sso/crosdom?action=login&savestate=1305728014&callback=sinaSSOController.doCrossDomainCallBack&scriptId=ssoscript0&client=ssologin.js(v1.3.12)&_=1305123230285 脚本设置COOKIE

不是新浪改了,而是这一块我没有分析到而已了,sina本身的SSO方式还是没有变的.
首先分析一下为什么在t.sina.com.cn中登录成功之后要在有这段请求吧?
可以肯定的是,这段请求是在 t.sina.com 中的 iframe 中通过   ajax/jsonp方式发起的,可以看如下图:

估计它是通过在iframe中的这段JS发起的请求:
sinaSSOController.setCrossDomainUrlList({"retcode":0,"arrURL":["http:\/\/weibo.com\/sso\/crosdom?action=login&savestate=1305731311"]});}

先不管它P3P的目的何在,先看看它这段请求对 weibo.com 域名做了哪些事,下面的截图是当我在 t.sina.com.cn 中登录成功之后,weibo.com中的cookie信息:

绝就绝在这里,它这段cookie是在什么时候加入进去的呢? 可以看出从 t.sina.com.cn中提交用户名到登录成功,整个过程中与weibo.com打过交道的; 只有以上第一个截图中的第二个请求,也就是你所说那个请求,那么就可以肯定的说 weibo.com中的cookie信息是通过在t.sina.com.cn这个域名下的iframe里面采用ajax/jsonp去请求weibo.com去设置的(也就是传说中的跨域设置cookie),看完这个链接之后,我想你应该猜出为什么 sina.com要使用P3P了。

好吧,再分析它为什么要这么麻烦去设置weibo.com中的cookie吧?
这篇文章中也提到,Sina的SSO判断用户是否已经登录了,是依赖于login.sina.com.cn/sso/login.php中cookie的,类似cas的做法:
denger 写道
CAS中的SSO处理就是,当我进入 weibo.com的时候,马上跳转至  /cas/login,然后在login中判断cookie是否存在TGT,如果存在,并确定其有效性后,则认为你已经登录,并为你生成一个ST,将ST作为ticket参数使其重定向至 weibo.com?ticket=TG-xxxx 并登录。如果不存在则重新返回至weibo.com中,需要你进行登录

如果sina是直接采用CAS的做法,每次进入 weibo.com 我都会重定向至  /sso/login.php判断这个用户是否登录过, 那就会造成我本身从来就没有登录过,然后刷新一下或每进入 weibo.com它就会重定向至 /sso/login.php(因为对于weibo.com域来说他不知道你是否已经通过其它域名在/sso/login.php登录成功了),然后/sso/login.php发现你没有登录过,又给你跳回来weibo.com中让你登录,再次回到weibo.com之后,weibo.com发现你没有登录,又会跳转至/sso/login.php,于是又跳回来...死循环就来了,虽然它可在第一次回到weibo.com的时候加一些标识表示不需要进行再去/sso/login.php了,不过最终这样来回的进行无意义的重定向不太好吧,为什么说无意义呢,因为我本身就从来没有登录过,你为什么还要让我跳转至 /sso/login.php进行自动登录呢?

基于上面的分析,提出的一个问题就是:当我进入weibo.com,我什么时候才需要重定向至 /sso/login.php 进行自动登录呢?   于是,基于这个问题,就不难判断出在 t.sina.com.cn中登录成功之后,为什么要去set weibo.com中的cookie了。因为按正常逻辑来说,只有当我已经登录成功过(不管在哪登录成功),我进入 weibo.com之后你才需要为我重定向至 /sso/login.php去自动登录,而不是进入无意义的重定向。 那么这时候当我在 t.sina.com.cn登录成功,并且在t.sina.com.cn中去设置 weibo.com的cookie,于是我再直接进入 weibo.com,这时候weibo.com首先做的不是直接重定向至 /sso/login.php进行登录,而是判断当前cookie是否存在某个已登的标识,如果存在的话我再重定向至 /sso/login.php进行自动登录,从而避免无意义的重定向。

对于以上的分析,你可以进行测试一下我说的是否符合逻辑:
  test1: 首先先将你本地的所有sina.com.cn 和 weibo.com中的cookie清空,然后在正常通过 t.sina.com.cn进行登录成功,这时候再新建一个选项卡,直接输入 weibo.com ,你会发现它马上会重定向至 /sso/login.php进行自动登录了。
      test2: 然后再分别注销,同样再删除sina.com.cn及weibo.com中的cookie,再正常通过 t.sina.com.cn 进行登录成功,这时候打开cookie管理器,将 weibo.com 中的所有cookie再全部删除,然后再新建一个选项卡,直接输入weibo.com,这时候你发现它不会进入重定向至 /sso/login.php了。而此时在weibo.com中是处于非登录状态,而在t.sina.com.cn中是处登录状态。这是因为进入weibo.com它未从cookie找到你已登录的标识,所以它认为你从来没有登录过,于是就不进入 /sso/login.php 进行自动登录了。
      test3:在sina.com.cn及weibo.com中都处于未登录状态,然后直接进入weibo.com,与test1对比起来,为什么它不会先重定向至 /sso/login.php了呢?在weibo.com中是根据什么来判断是否需要重定向至 /sso/login.php?通过test2的测试我想也不用我说了吧。

  如果按你说的,那么在test1中t.sina.com.cn中登录成功并且已经设置weibo.com中的cookie,为什么进入weibo.com还要去重定向 /sso/login.php去自动登录呢。

  • 大小: 83.4 KB
  • 大小: 56.2 KB
0 请登录后投票
   发表时间:2011-05-12  



 [quote="denger"]
基于上面的分析,提出的一个问题就是:当我进入weibo.com,我什么时候才需要重定向至 /sso/login.php 进行自动登录呢?   于是,基于这个问题,就不难判断出在 t.sina.com.cn中登录成功之后,为什么要去set weibo.com中的cookie了。因为按正常逻辑来说,只有当我已经登录成功过(不管在哪登录成功),我进入 weibo.com之后你才需要为我重定向至 /sso/login.php去自动登录,而不是进入无意义的重定向。 那么这时候当我在 t.sina.com.cn登录成功,并且在t.sina.com.cn中去设置 weibo.com的cookie,于是我再直接进入 weibo.com,这时候weibo.com首先做的不是直接重定向至 /sso/login.php进行登录,而是判断当前cookie是否存在某个已登的标识,如果存在的话我再重定向至 /sso/login.php进行自动登录,从而避免无意义的重定向。
[/quote="denger"]

基于测试,发现新浪的设置微博通过P3P协议设置weibo.com域下cookie确实是为了判断是否有必要到/sso/login进行验证登录。
不过我有个以为。既然已经通过P3P设置了weibo.com域下的cookie了。weibo.com为什么不直接通过cookie信息来判断用户是否登录。完全没必要到/sso/login去验证然后再返回。我能想到的有两个原因:
1,安全方面的考虑
2,以后其他应用在登录机制扩展方面的考虑

而且我发现我之前的测试都是在先在t.sina.com.cn登录,后使用weibo.com查看的顺序来。
这次我为了验证第一条,就反过来,现在weibo.com进行登录,登录成功之后,接着直接访问t.sina.com.cn,发现t.sina.com.cn没有到/sso/login进行验证就直接判断为登录状态了,由此可以推测是通过cookie信息来进行验证的。既然t.sina.com.cn可以通过cookie信息来验证,那么就不存在第一条,安全方面的考虑。

ps:在上面的验证过程中,我又发现了一个问题(真是头大,一个接着一个),在weibo.com的登录过程中,我没有发现哪个请求设置了t.sina.com.cn的cookie信息。。。。发现只有一条设置了COOKIE,但是是这只在login.sina.com.cn域下(见图一)。t.sina.com.cn应该是读不到的才对。但是事实是t.sina.com.cn就是读到了(见图2)。。

至于第二条原因,可能验证登录的业务逻辑很复杂(什么权限控制啊,是否限制登录啊。还有N多七七八八的原因),不能放每个应用都去用程序实现这个业务逻辑判断,所以才独立出一个/sso/login的登录系统出来。

 

图一

 

 

图二
 

  • 大小: 216.7 KB
  • 大小: 165.3 KB
0 请登录后投票
   发表时间:2011-05-12   最后修改:2011-05-12
@aweber 你说的这个问题我昨天已经发现了,晚上我说说为什么会这样,现在太忙.....
0 请登录后投票
   发表时间:2011-05-12  
好贴,分析的很透彻
0 请登录后投票
   发表时间:2011-05-13  
受益颇丰啊

有些内容还没能理解

需要慢慢看
0 请登录后投票
   发表时间:2011-05-18  
请楼主再分析一下统一注销是如何实现的吧,我觉得这个比统一登录更难搞哎
0 请登录后投票
   发表时间:2011-05-19  
popoer 写道
请楼主再分析一下统一注销是如何实现的吧,我觉得这个比统一登录更难搞哎

好的,等放假的时候结合CAS进行分析一下,现在太忙了。
0 请登录后投票
   发表时间:2011-05-20  
详细看了下, 还是有很多不了解的地方。
楼上很多朋友都说cookie判断饿。
我这里跨域了。。想获取cookie都获取不到。在看各种关于跨域的文章。。希望能解决自己的问题
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics