多平台的网站实现单点登录系统(SSO)的开发思路 让你的会员中心更加统一(参考资料)
单点登录并不是一个新鲜的玩意儿,比较官方的解释是企业业务整合的解决方案之一,通俗来讲SSO就是一个通用的用户中心,国内比较流行的UCenter就是一套单点登录解决方案。而近期以CSDN明文存储用户密码并泄露用户信息开始的各大网站争先恐后的泄露自己的用户数据库除了暴露了这些网站的良心和智商外,如何设计用户中心已成为架构师们的热点话题之一。在最近一两年的项目经验中有幸接触到各种平台的单点登录系统的开发,所以借此机会总结下B/S架构的单点登录系统的开发经验。
单点登录系统的类别
就目前比较流行的应用来看,单点登录系统主要分为三种类型:一种是基于oauth协议的网络令牌(我是这么叫的),一种是基于Web Service或者简单Http协议实现的Passport机制,还有一种是以openid框架形成的通用账号登录机制。其中,基于oauth协议主要应用在网站外部,比较知名的有Google Account、Facebook Connect和新浪微博链接等;Passport的应用主要是针对同一网站内不同架构不同平台,知名产品则更是数不胜数,例如Google Account账号基本上可以应用全部Google的网站,而国内各大门户无数的应用系统也都只需要一个用户通行证就能畅通无阻;至于OpenID这样会共享用户信息的应用,在国外可能会很火,在国内这样一个用户一寸金的利益集团面前可能会被采纳,所以下面的论述也主要针对前面两种。
单点登录系统的优点
对于用户来讲,最理想的情况下一个账号和密码就可以横行整个互联网,当然这是不可能的。不过现实中稍微有点价值的网站基本上都可以支持各种oauth协议的单点登录系统,所以能使用微博账号、SNS账号或者豆瓣账号登陆的将会为用户带来更多的方便。
对于企业来讲,尤其是业务繁琐复杂的大企业,单点登录系统可以让他们不必为每一个应用都开发用户系统,从而大大降低了工作量,而且统一的用户数据在后期管理和维护中也会更加方便。而基于oauth协议的单点登录系统虽然开发成本高昂,但是能为企业带来最具有价值的第一手用户信息,其收益可观。
单点登录系统的基本流程

如上图所示,不管是哪种方式的SSO系统其功能流程大概都是这样:应用系统只需要调用SSO的验证接口验证当前用户是否为已登录用户,如果是未登录用户或者严重不合法则跳转到SSO系统。此时已注册用户可以直在SSO成功登录后返回应用系统,应用系统开始重复上述步骤;而未注册用户则需要先注册或者使用第三方SSO初始化账号,继而重复上述步骤。
不同的是,账号链接这样的SSO系统在登陆成功后返回给应用系统一个key值、用户uid和其他信息,而应用系统一般还是需要在自己的用户系统中新建一个用户账户并且建立一个映射关系来关联SSO系统的返回值。如下图所示是实现绑定微博账号登陆的数据库模型图,其中应App_Users表可以实现一个用户绑定多个单点登录账号,并且这样的用户是不需要再应用系统中存储密码等不必要的信息的。而Passport机制的SSO系统基本上处理所有用户登录、注册、验证的行为,其他应用系统只需要按需取用即可。

单点登录系统开发难点
从上述功能流程可以看出,使用基于oauth协议的单点登录系统应该是比较好的解决方案,但是没有谁愿意把用户的掌控权拱手让给别人,所以国内很多中小网站就算是没有能力开发自己的passport单点登录系统,也会去选择UCenter这样第三方开源的单点登录系统。而Passport机制的单点登录系统都会面临这么一个问题,如何跨域传递cookies,至于为什么使用cookies、为什么要跨域这么啰嗦的废话我就不多写了,常用的跨域传递cookies的方法有三种:javascript/iframe、header和借助数据库。
javascript/iframe的思路是将单点登录种下的cookie动态传到应用系统,在ajax/jquery广泛应用的时代javascript的是很常见的解决方案,例如UCenter的做法就是在单点登录系统登陆后使用一段javascript动态把cookie传递到所有设置为同步登录的应用,而iframe因为存在诸多弊端不建议使用。
header的解决方法是使用P3P机制进行跨域传输,但是IE必须用加P3P的头信息才可以跨域。看来IE对跨域的限制更为严格!所以要想实现完全跨域,在header头里面加上这一句话最好:header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA div COM NAV OTC NOI DSP COR"');。不过在以前使用P3P协议开发单点登录系统的时候或多或少都有些莫名其妙的问题,看来还是掌握的太少了。
数据库存储,还是以Ucenter为例,在Discuz的cdb_sessions表就是一个结合session实现的跨域传递session的功能,只不过这样的功能会给数据库带来严重的I/O负担,但凡有点流量再碰上点极品的用户这样的数据库性能肯定要被严重拖累。
在我实际开发过程中,一般这样解决单点登录系统的跨域传递cookie问题:首先验证用户来源是否在我们的站点列表内(如果是首先进入SSO则略去这一步),其次验证用户合法性,用户通过验证后,加密cookie和公用密钥后的值将会在用户登录之后作为参数一起跳转回来来源的应用系统,应用系统获取到cookie值后调用SSO接口进行解密、验证等工作。此外,还有一种比较简略的SSO设计方案,所有SSO系统应有的功能都以API形式呈现,接受被授权的应用系统的请求并且返回相应的XML或者Json结果,不同的是,这样做需要应用系统最起码的有自己的登陆和注册页面,适用于同步不得不使用自己用户功能的已经成型的外部应用系统。
此外,在上一篇文章中讨论过的用户密码加密问题,由上图也可以看出,pass字段存储的应该是用户真正的密码经过md5和加上salt值(随机字符串)再次md5,也就是md5(md5(realpass).salt),这个是程序猿应该知道的最基础的加密方式。此外,很多人容易忽略的一个地方是cookie校验,至少我亲身体验了京东修改完用户密码以前种下的cookie依然可以使用,Firebug看了下京东存储的Cookie虽然是加密的,但是明显的验证cookie只是验证了cookie是否为空或者是否可以解密,而完全没有去验证cookie用户是否合法,这样如果知道了京东的加密算法,即便是不知道用户密码,也可以伪造用户cookie进入用户账户。
至于网上很多企业给出的SSO解决方案,我就不喷了,MD,如果真要用,UCenter或者简单的使用新浪、腾讯、豆瓣的网站链接都不错,虽然UCenter问题很多(这个以后再喷),但是最起码的企业对用户具有完全的掌控权。
http://www.itokit.com/2012/0523/74123.html
多平台的网站实现单点登录系统(SSO)的开发思路 让你的会员中心更加统一(参考资料)的更多相关文章
- 单点登录系统(SSO)的开发思路
单点登录并不是一个新鲜的玩意儿,比较官方的解释是企业业务整合的解决方案之一,通俗来讲SSO就是一个通用的用户中心,国内比较流行的UCenter就是一套单点登录解决方案.而近期以CSDN明文存储用户密码 ...
- 单点登录系统SSO实现
前些天被问到单点登录了,而据我当时做的这个模块两年了,现在重新温习并记录下,方便以后快速回忆起来 一.什么是单点登录系统 SSO全称Single Sign On.SSO是用户只需要登录一次就可以访问所 ...
- 单点登录系统(SSO)之CAS(中央认证服务)
SSO(Single Sign On)单点登录系统,是在多个系统中值要求只要登录一次,就可以用已登录的身份访问多个系统,去掉了每次访问不同的系统都要重新登录的弊端. CAS(中央/集中认证服务):Th ...
- 单点登录系统---SSO
1.------------------SSO介绍--------------------------------- 有什么卵用?搞什么飞机的? 大家看看这个图,一个系统是没有问题.如果是分布式的系统 ...
- 单点登录系统(SSO)详细设计说明书(上篇)
1.引言 1.1编写目的 为了单点登录系统(SSO系统)的可行性,完整性,并能按照预期的设想实现该系统,特编写需求说明书. 同时,说明书也发挥与策划和设计人员更好地沟通的作用. 1.2 ...
- 第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第十天】(单点登录系统实现)
https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...
- SSO - 我们为何需要单点登录系统
SSO,Single Sign On,也就是单点登录,保证一个账户在多个系统上实现单一用户的登录 现在随着网站的壮大,很多服务会进行拆分,会做SOA服务,会使用dubbo做微服务,或者简单的小型分布式 ...
- 八幅漫画理解使用JSON Web Token设计单点登录系统
用jwt这种token的验证方式,是不是必须用https协议保证token不被其他人拦截? 是的.因为其实只是Base64编码而已,所以很容易就被解码了.如果你的JWT被嗅探到,那么别人就可以相应地解 ...
- 八幅漫画理解使用 JSON Web Token 设计单点登录系统
原文出处: John Wu 上次在<JSON Web Token – 在Web应用间安全地传递信息>中我提到了JSON Web Token可以用来设计单点登录系统.我尝试用八幅漫画先让大家 ...
随机推荐
- golang学习笔记 ---命令行参数
os 包以跨平台的方式,提供了一些与操作系统交互的函数和变量.程序的命令行参数可从os包的Args变量获取:os包外部使用os.Args访问该变量. os.Args变量是一个字符串(string)的切 ...
- mysql获取group by的总记录行数方法
mysql获取group by内部可以获取到某字段的记录分组统计总数,而无法统计出分组的记录数. mysql的SQL_CALC_FOUND_ROWS 使用 获取查询的行数 在很多分页的程序中都这样写: ...
- Linux中iptables防火墙指定端口范围
我需要700至800之间的端口都能tcp访问 代码如下 复制代码 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 7 ...
- systemd的程序自启动脚本编写
以FreeSWITCH的自启动脚本为例. 一. 编写freeswitch.service文件 [Unit] Description=FreeSWITCH After=syslog.target net ...
- 冒泡,setinterval,背景图的div绑定事件,匿名函数问题探究
1.会冒泡到兄弟元素么? $(function(){ $("#a").click(function(){alert("a")}) $("#b" ...
- sqlserver中创建链接服务器图解教程
1.展开服务器对象-->链接服务器-->右击"新建链接服务器" 注意:必须以数据库管理员身份登录(通常也就是sa帐号)后,才可以创建"链接服务器" ...
- JavaWeb 返回json数据的两种方式
1.说明 由于一般情况下,由浏览器(前端)发送请求,服务器(后台)响应json数据,所以这里结合js进行说明: A服务器发送请求至B服务器,并接收其返回的json数据,见文末推荐,这里不再赘述! 2. ...
- Vue(五):Vue模板语法
1.{{...}}(双大括号) 文本插值 <div id="app"> <p>{{ message }}</p> </div> 2. ...
- iOS 中strong,weak,copy,assign区别
1:ARC环境下,strong代替retain.weak代替assign2:weak的作用:在ARC环境下,,所有指向这个对象的weak指针都将被置为nil.这个T特性很有用,相信很多开发者都被指针指 ...
- 2-2-求并集A=A∪B-线性表-第2章-《数据结构》课本源码-严蔚敏吴伟民版
课本源码部分 第2章 线性表 - 求并集A=A∪B ——<数据结构>-严蔚敏.吴伟民版 ★有疑问先阅读★ 源码使用说明 链接☛☛☛ <数据结构-C语言版>(严 ...