新浪微博SSO登陆机制

国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html
内部邀请码:C8E245J (不写邀请码,没有现金送)
国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为中国PE第一股,市值超1000亿元。 

------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

原文地址: http://blog.sina.com.cn/s/blog_7a09f0920101agni.html

最近在使用sina微博时,经常性交替使用 weibo.com 和 t.sina.cm.cn进入我的微博。发现当我在 t.sina.com.cn中登录之后,直接切换至weibo.com,这时候在 weibo.com是已经登录的,当我在 weibo.com进行注销之后,再切换至 t.sina.com.cn,这时候在 t.sina.com.cn也已经是注销的状态了。

     对于SSO的实现方案及其机制,早已经不是什么新鲜的技术了,从微软为.net提供的passport机制到java中开源的JBoss SSO、Oracle OpenSSO及经典的 Yale CAS等等之类的开源或一些商业SSO中间件都不失为作为单点登录实现的选择。当然一些企业也会选择自己实现一套适合自己轻量级方案,如采用 SESSIONID转递或SESSION同步复制之类的。 可以看得出SSO的价值也是具大的,就拿sina来说吧,增加 weibo.com域名之后,对于用户来说来说没有任何影响,即使你在 t.sina.com.cn中进行登录,可以无缝在两域名之间随意切换,对于它推广weibo.com无非是大大的益处。

    由于近年来一直在使用 Yale的CAS作为SSO的方案,觉得 SINA的SSO与Yale-CAS有很多异曲同工之妙,于是便对SINA的SSO进行分析,其中的细节处理还是很值的学习的。当然,由于分析看到的 SINA SSO处理都只是一些表现或表面上的东西,再加上其大部分关键的sso js都已经被压缩,及SERVER端的实现机制也只是靠自己的经验及结合CAS的的一些原理进行猜测。其实本文应该叫 更比较贴切。
  
    好吧,进入正题。


  • Sina SSO之分析篇

    首先是进入 t.sina.com.cn,提交用户名及密码进行登录,通过 Firebug可以看到它通过类似Aajx POST到了 http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.12),如下图所 示:
    新浪微博SSO登陆机制 

    不难看出,其 http://login.sina.com.cn/sso/login.php 就是类似是 CAS 中的 Server,对sina的所有应用系统提供的统一登录入口。上面的参数中有一个service参数,了解 CAS的GG应该知道 cas 在登录的时候除了username 和 password同样也有一个 service 参数,其CAS该参数含义是子应用系统的服务名标识及登录成功之后所跳转的地址。当然,sina这里使用了 "miniblog"作为微博的服务名,估计他在sso-server端对 miniblog 与登录成功之后的地址进行映射,如 miniblog=http://t.sina.com.cn/,这样就避免了CAS-client中转入service= decodeURIComponent('http://t.sina.com.cn')之类的做法了。

    这里的登录与CAS做法一致,将登录验证提交至统一的认证中心进行验证处理,从而避免了跨子域和全域的问题。 验证成功之后路转的路径就是service 所向的地址,验证失败之后则返回至当前登录页。下面就SSO中的一些登录方面的核心问题做一些分析,看看SINA和CAS分别是如何处理的:

      1.如何授权某个子系统允许其在sso-server进行登录验证呢,类似cas-server中的login-ticket;
        对于cas来说,在首次进入  /cas/login页时, 会产生一个一次性的login-ticket,也就是说在提交登录验证前必须向服务器请求一个login-ticket,在登录提交时,需要将用户名及密码以及login-ticket进行提交至 cas-server端,cas-server端确定login-ticket有效后才会对用户名及密码进行认证。
        看看sina如何处理的吧,继续看firebug:
        新浪微博SSO登陆机制       以上截图是当我首次进行 t.sina.com.cn时,通过 ajax/jsonp的方式发起的一个请求,可以看到返回的callback函数中的 json 串中包含了 nonce:"SXK19N"的属性,参数名的汉译是“一次”或“一次性”的意思,估计这里的 nonce就是login-ticket,为再一次确实,我再试着提交登录看看,看它是否将该参数POST过去:
       新浪微博SSO登陆机制 
       果然不出所料, nonce:"SXK19N"作为参数提交过去了,证明所猜测的应该是正确的。

  2.比如验证码跨域跨服务器导致从session无法获取的问题,我们曾经遇到过;
        貌似sina登录没有涉及到验证码之类的东西,当你多次登录失败之后,它采用的是“您的登录过于频繁,请稍后再试吧”,这种方案确实比验证码要好的多,而且还避免了上面的说的问题。

     3. 当我登录失败了,/sso/login.php 如何将登录的错误信息返回给 t.sina.com.cn并让它进行显示呢,如果我登录成功了/sso/login.php 通过什么方式通知t.sina.com.cn呢,因为它这里使用的是ajax方式登录?
       对于这方面,cas的处理是将错误信息以参数的方式返回给 client-login,如登录失败,重定向地址: http://cas-client.com?errocode=0,如果登录成功,则直接 重定向至 service 中的url,并生成ST给客户端,表示其已经在cas-server登录成功了。
       看看sina如何处理的吧,随便输入一个用户名密码,提交登录,继续通过firebug看看它的处理过程:
   新浪微博SSO登陆机制
        再看看t.sina.com.cn 中的html内容的变化:
        新浪微博SSO登陆机制 
       
    以上图1中发生了两次请求,第一次登录验证是访问 sso认证中心,它所返回response是一个html内容,第二次请求的地址: http://t.sina.com.cn /ajaxlogin.php framelogin=1& callback=parent.sinaSSOController.feedBackUrlCallBack&retcode=4038& amp;reason=���)
    再结合以上图2信息,看到 html 中发生了变化,创建了一个 id=ssoLoginFrame 的iframe,于是便可以得出,sina 的登录并非原生的ajax方式,而是通过创建iframe来模拟提交不刷新的登录。也就是说,当用户点击登录提交时,这时候它会通过js创建 iframe,将登录提效至该iframe中。
         既然已经知道它登录是提交到iframe中,而非ajax方式,那么对于以上截图1中两个请求为什么返回的都是HTML内容就很容易解释了。再回到上面的 问题,/sso/login是如何通知t.sina.com.cn登录失败了呢? 首先在以上第一个截图中返回的 HTML包含了一段 javascript:
       

Javascript代码   收藏代码
  1. location.replace("http://t.sina.com.cn/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&retcode=4038&reason=��¼�%A����Դ������Ƶ�������Ժ��ٵ�¼");  


         location.replace的意思与location.href类似,同样都是改变当前的URL地址,具体区别及做法可以参考这里这里。需要注意的这里所说的通过location.replace改变当前的URL其它并非改变t.sina.com.cn的地址,而是第二个截图里iframe中src的地址,因为这段HTML是在iframe中输出的。
       在  locaiton.replace 的地址中包含了一个 retcode 及 reason参数,估计这就是当前登录的错误信息。在上面第一个截图的第二个请求实际就是在iframe 中进行的 location.replace操作后的跳转地址。关键看它输出的html内容:
  

国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html
内部邀请码:C8E245J (不写邀请码,没有现金送)
国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为中国PE第一股,市值超1000亿元。 

------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

Html代码   收藏代码
  1. <</span>html><</span>head>  
  2. <</span>script language='javascript'>  
  3.  parent.sinaSSOController.feedBackUrlCallBack({"result":false,"errno":"4038","reason":"\u767b\u5f55\u5c1d\u8bd5\u6b21\u6570\u8fc7\u4e8e\u9891\u7e41\uff0c\u8bf7\u7a0d\u540e\u518d\u767b\u5f55"});</</span>script></</span>head><</span>body></</span>body></</span>html>null  


      这段js是在 iframe中执行的,所以可以通过 parent 进行访问 t.sina.com.cn中的js,可以肯定 parent.sinaSSOController.feedBackUrlCallBack 就是告诉 t.sina.com.cn 当前已经登录失败了,并且将错误信息传至该入该callback了。至此,已经完成了 /sso/login.php 对 t.sina.com.cn的信息传送。 新浪果然是有一手呀,在CAS中AJAX登录一直都是一个问题,而sina它巧妙的通过 iframe+callback 进行实现了。
      接着,再看看它对于登录成功之后如何通知 t.sina.com.cn的吧,先看看登录成功之后 sina-sso-server 会做什么,看firebug截图:
       新浪微博SSO登陆机制
       重点在于 set-Cookie: tgc=TGT-MTc4NTc0NzM0Mw==-1305003116-ja- D51B2EB107B79FC50D8CA424BFE08907;  哈哈,熟悉CAS的应该会很熟悉这个,没想到SINA的TGT与CAS的TGT不但参数命名,居然连生成的规则也一模一样,估计sina肯定是参考了 cas 的实现机制。关于TGT是什么或其作用可以参考:CAS总结之Ticket篇。另外还有一个就是当登录成功之后,sina-sso-server会将用户登陆名等等放在sina.com.cn根域的cookie中。
       然后再看看登录成功之后 sina-sso-server所返回的response内容:
       新浪微博SSO登陆机制
       以下是从以上摘取JS部分:
      

Javascript代码   收藏代码


      首先再次声明,以上firebug截图中的请求处理,并非 AJAX,而是在 t.sina.com.cn中放了一个iframe,输出的 reponse都会至iframe当中.    
      以上的js主要重点在于:
     

Javascript代码   收藏代码
  1. location.replace('http://t.sina.com.cn/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&retcode=0')  


      还是通过设置当前iframe中src地址,再看看跳转至http://t.sina.com.cn/ajaxlogin.php后的response内容吧:
      新浪微博SSO登陆机制
      返回用户信息(从cookie中获取的),并且还是类似上面的做法,通过 parent.sinaSSOController.feedBackUrlCallBack回调t.sina.com.cn中的js,告诉它这个用户已经登录成功了。
      于是t.sina.com.cn便进行跳转至 t.sina.com.cn/dengers 中,从而实现登录。
      新浪微博SSO登陆机制
      整体的处理流程如下:
      新浪微博SSO登陆机制


      4. 当我在t.sina.com.cn中登录后,切换至weibo.com,weibo.com我应该也是已经登录的,如何做到呢?
       对于这个问题,CAS中的处理就是,当我进入 weibo.com的时候,马上跳转至  /cas/login,然后在login中判断cookie是否存在TGT,如果存在,并确定其有效性后,则认为你已经登录,并为你生成一个ST,将ST 作为ticket参数使其重定向至 weibo.com?ticket=TG-xxxx 并登录。
      看看sina怎么处理的吧,首先我直接在t.sina.com.cn登录成功。然后再新建一个选项卡,输入 weibo.com:
      新浪微博SSO登陆机制
      可以看得出,当我进入 weibo.com之后,sina并没有直接进入 weibo.com的主页,而是马上重定向至:  http://login.sina.com.cn/sso/login.php?url=http://weibo.com/&_rand=1305008634.5127&gateway=1&service=miniblog&useticket=1&returntype=META  与cas的做法确实一致。 再看看该 login.php的Response 信息,主要是JS:
      

Js代码   收藏代码
  1. "text/javascript" language="javascript">  
  2. location.replace("http://weibo.com/sso/login.php?url=http://weibo.com/&ticket=ST-MTc4NTc0NzM0Mw==-1305008634-ja-694BA43623A3F72999AE7129A0572048&retcode=0");  
  3.   


      看到这里之后,不得不怀疑 SINA 的 SSO 是不是用的就是 CAS 啊!!不但连 TGT 参数名一样,连ST规则及参数名也一模一样,其处理机制也十分相似。
      到这里之后就与 CAS 的处理一样了,就不详细写了,可以参考 CAS相关文章。

──────────
PS:由于在分析过程中里面的很多SSO关键JS都压缩了,所以难免会存在误差。 不过SINA的SSO很多细节方面确实处理的很好,作为互联网 应用的话,如果单纯的只是把 CAS DOWNLOAD 下来,然后直接配配就用的话很多方面的处理还是很不到位的。 有时间我把我们CAS参考 SINA 调整一下。



    到这里,不得不说的一个事情就是,之前在分析淘宝cookie如何跨域获取时, 大家都说出了一个taobao的jsonp实际存在一定的安全隐患。后面那个淘宝的GG看到之后加入Refer的判断。而现在,在分析的过程中发现新浪也 有这样的问题,可以尝试一下,随便在本地建立一个html,引入jquery,然后使用下面的JS,就可以获取到sina中的登录邮箱名等信息,前提是你 需要先在sina中登录:
 

Js代码   收藏代码
    1. $.ajax({url: 'http://t.sina.com.cn/ajaxlogin.php?framelogin=0&callback=?&retcode=0', dataType:'jsonp',  
    2.                 success:function(data){  
    3.                     alert(data.userinfo.userid);  
    4.                 }});  
    5. 国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html
      内部邀请码:C8E245J (不写邀请码,没有现金送)
      国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为中国PE第一股,市值超1000亿元。 

      ------------------------------------------------------------------------------------------------------------------------------------------------------------------

       

转载于:https://www.cnblogs.com/AloneSword/p/3840548.html

【基于QT的调色板】是一个使用Qt框架开发的色彩选择工具,类似于Windows操作系统中常见的颜色选取器。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面、移动和嵌入式设备,支持C++和QML语言。这个调色板功能提供了横竖两种渐变模式,用户可以方便地选取所需的颜色值。 在Qt中,调色板(QPalette)是一个关键的类,用于管理应用程序的视觉样式。QPalette包含了一系列的颜色角色,如背景色、前景色、文本色、高亮色等,这些颜色可以根据用户的系统设置或应用程序的需求进行定制。通过自定义QPalette,开发者可以创建具有独特视觉风格的应用程序。 该调色板功能可能使用了QColorDialog,这是一个标准的Qt对话框,允许用户选择颜色。QColorDialog提供了一种简单的方式来获取用户的颜色选择,通常包括一个调色板界面,用户可以通过滑动或点击来选择RGB、HSV或其他色彩模型中的颜色。 横渐变取色可能通过QGradient实现,QGradient允许开发者创建线性或径向的色彩渐变。线性渐变(QLinearGradient)沿直线从一个点到另一个点过渡颜色,而径向渐变(QRadialGradient)则以圆心为中心向外扩散颜色。在调色板中,用户可能可以通过滑动条或鼠标拖动来改变渐变的位置,从而选取不同位置的颜色。 竖渐变取色则可能是通过调整QGradient的方向来实现的,将原本水平的渐变方向改为垂直。这种设计可以提供另一种方式来探索颜色空间,使得选取颜色更为直观和便捷。 在【colorpanelhsb】这个文件名中,我们可以推测这是与HSB(色相、饱和度、亮度)色彩模型相关的代码或资源。HSB模型是另一种常见且直观的颜色表示方式,与RGB或CMYK模型不同,它以人的感知为基础,更容易理解。在这个调色板中,用户可能可以通过调整H、S、B三个参数来选取所需的颜色。 基于QT的调色板是一个利用Qt框架和其提供的色彩管理工具,如QPalette、QColorDialog、QGradient等,构建的交互式颜色选择组件。它不仅提供了横竖渐变的色彩选取方式,还可能支持HSB色彩模型,使得用户在开发图形用户界面时能更加灵活和精准地控制色彩。
标题基于Spring Boot的二手物品交易网站系统研究AI更换标题第1章引言阐述基于Spring Boot开发二手物品交易网站的研究背景、意义、现状及本文方法与创新点。1.1研究背景与意义介绍二手物品交易的市场需求和Spring Boot技术的适用性。1.2国内外研究现状概述当前二手物品交易网站的发展现状和趋势。1.3论文方法与创新点说明本文采用的研究方法和在系统设计中的创新之处。第2章相关理论与技术介绍开发二手物品交易网站所涉及的相关理论和关键技术。2.1Spring Boot框架解释Spring Boot的核心概念和主要特性。2.2数据库技术讨论适用的数据库技术及其在系统中的角色。2.3前端技术阐述与后端配合的前端技术及其在系统中的应用。第3章系统需求分析详细分析二手物品交易网站系统的功能需求和性能需求。3.1功能需求列举系统应实现的主要功能模块。3.2性能需求明确系统应满足的性能指标和安全性要求。第4章系统设计与实现具体描述基于Spring Boot的二手物品交易网站系统的设计和实现过程。4.1系统架构设计给出系统的整体架构设计和各模块间的交互方式。4.2数据库设计详细阐述数据库的结构设计和数据操作流程。4.3界面设计与实现介绍系统的界面设计和用户交互的实现细节。第5章系统测试与优化说明对系统进行测试的方法和性能优化的措施。5.1测试方法与步骤测试环境的搭建、测试数据的准备及测试流程。5.2测试结果分析对测试结果进行详细分析,验证系统是否满足需求。5.3性能优化措施提出针对系统性能瓶颈的优化建议和实施方案。第6章结论与展望总结研究成果,并展望未来可能的研究方向和改进空间。6.1研究结论概括本文基于Spring Boot开发二手物品交易网站的主要发现和成果。6.2展望与改进讨论未来可能的系统改进方向和新的功能拓展。
1. 用户与权限管理模块 角色管理: 学生:查看个人住宿信息、提交报修申请、查看卫生检查结果、请假外出登记 宿管人员:分配宿舍床位、处理报修申请、记录卫生检查结果、登记晚归情况 管理员:维护楼栋与房间信息、管理用户账号、统计住宿数据、发布宿舍通知 用户操作: 登录认证:对接学校统一身份认证(模拟实现,用学号 / 工号作为账号),支持密码重置 信息管理:学生完善个人信息(院系、专业、联系电话),管理员维护所有用户信息 权限控制:不同角色仅可见对应功能(如学生无法修改床位分配信息) 2. 宿舍信息管理模块 楼栋与房间管理: 楼栋信息:名称(如 "1 号宿舍楼")、层数、性别限制(男 / 女 / 混合)、管理员(宿管) 房间信息:房间号(如 "101")、户型(4 人间 / 6 人间)、床位数量、已住人数、可用状态 设施信息:记录房间内设施(如空调、热水器、桌椅)的配置与完好状态 床位管理: 床位编号:为每个床位设置唯一编号(如 "101-1" 表示 101 房间 1 号床) 状态标记:标记床位为 "空闲 / 已分配 / 维修中",支持批量查询空闲床位 历史记录:保存床位的分配变更记录(如从学生 A 调换到学生 B 的时间与原因) 3. 住宿分配与调整模块 住宿分配: 新生分配:管理员导入新生名单后,宿管可按专业集中、性别匹配等规则批量分配床位 手动分配:针对转专业、复学学生,宿管手动指定空闲床位并记录分配时间 分配结果公示:学生登录后可查看自己的宿舍信息(楼栋、房间号、床位号、室友列表) 调整管理: 调宿申请:学生提交调宿原因(如室友矛盾、身体原因),选择意向宿舍(需有空位) 审批流程:宿管审核申请,通过后执行床位调换,更新双方住宿信息 换宿记录:保存调宿历史(申请人、原床位、新床位、审批人、时间) 4. 报修与安全管理模块 报修管理: 报修提交:学生选择宿舍、设施类型(如 "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值