单点登录(SSO)学习笔记:
1.概念:
单点登录的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统,目的是简化账号登录过程并保护账号和密码安全,对账号进行统一管理。
就比如集客项目,工号信息在多个系统共享,并且这些应用系统将要集成在同一个页面内,之前可以从各自的系统进行登录,但集成之后如果还需要在这个系统内多次登录,就很没有必要并且很麻烦。所以要实现一家企业下的服务只要一次注册,登录的时候只要一次登录,退出的时候只要一次退出。
在通过验证后,服务端session会给客户端cookie颁发一个sessionID,再次访问的时候,客户端就可以用sessionID来作为凭证,不需再次输入账号密码等验证信息登录,而服务端需要用session来验证ID的有效性,客户端持有ID,服务端持有session,两者一起用来保持登录状态~
但是session这东西一开始是每个server自己独有的,豆瓣FM有自己的session、豆瓣读书有自己的session,一个服务端session对应一个客户端的cookie,记录sessionID的cookie又是不能跨域的。所以,我们要实现一次登录一次退出,只需要想办法让各个server的共用一个session的信息,让客户端在各个域名下都能持有这个ID就好了。再进一步讲,只要各个server拿到同一个ID,都能有办法检验出ID的有效性、并且能得到ID对应的用户信息就行了,也就是能检验ID 。
2.实现方法:
server端(共享session):
之前都是一个session对应一个server,现在可以变成针对一个server群,拿一个session出来让大家共享,表示不再是之前的sessionID,而是叫token,这种标识是整个server群唯一的,并且所有server群都能验证这个token,同时能拿到token背后代表的用户的信息。
浏览器端(共享cookie):
既然session实现了共享,那么它对应的cookie也应该在不同用户的浏览器端实现共享。用户登录成功拿到token(或者是session-id)后怎么让浏览器存储和分享到其它域名下?同域名很简单,把token存在cookie里,把cookie的路径设置成顶级域名下,这样所有子域都能读取cookie中的token。这就是共享cookie的方式。比如:谷歌公司,google.com是他的顶级域名,邮箱服务的mail.google.com和地图服务的map.google.com都是它的子域。这里可以使用setcookie函数,该函数的第四个参数是用来设置cookie所述域的。
setcookie(‘username’,’zhangsan’,null,’.google.com’);
setcookie(‘password’,’123’,null,’.google.com’);
要实现单点登录,所有应用系统都应该共享一个身份认证系统,并且所有应用系统能够识别和提取ticket信息。
但是也有跨域的情况,比如谷歌公司还有一个域名:youtube.com,提供视频服务 。
为了可以登录不同域的系统,我们需要在设置系统1的cookie的同时也对系统2和系统3进行cookie设置,因此在对系统1进行响应之前,我们需要先跳转到系统2和系统3站点去设置cookie信息,可以通过地址重定向来实现。
3.企业应用集成:
单点登录体现的是企业应用集成中的一方面。企业应用集成可以在不同层面上进行:例如在数据存储层面上的“数据大集中”,在传输层面上的“通用数据交换平台”,在应用层面上的“业务流程整合”,和用户界面上的“通用企业门户”等等。事实上,还有一个层面上的集成变得越来越重要,那就是“身份认证”的整合,也就是“单点登录”。