SSO
单点登录是指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
最初的时候,服务的提供者只做了一个单系统,所有的功能都在单系统上,此时不需要SSO
,一次登录就可以访问所有功能,后来用户量越来越大且功能服务越来越多,为了合理利用资源和降低耦合性,服务商将功能划分为多个子系统,而子系统的用户登录凭证是相互隔离的,如果在这个子系统登录完成,再访问另一个子系统还需要登录,这显然不太合适,而SSO
就是对于这种问题的解决方案,在多个系统中,用户只需要某一个系统中登录,在其他系统中都无需再次验证用户身份即可静默登录,例如在百度一次登录,再访问贴吧、网盘等都可以静默登录。
OAUTH
开放授权的服务端和第三方客户端不属于一个互相信任的应用群,而单点登录SSO
的子系统都在一个互相信任的应用群,通常是同一个公司提供的服务。OAUTH
开放授权主要是让用户自行决定在服务端的个人资源是否允许第三方应用访问,资源都在OAUTH
服务提供者那一方,客户端是想索取用户的资源,而单点登录SSO
的资源本身都在子系统这边,而不是在SSO
服务器这一方,主要服务是用于登录,以及管理用户在各个子系统的权限信息。如果系统是使用SESSION
来记录用户信息的话,那么就可以采用共享SESSION
的方式进行实现单点登录,使用SESSION
信息作为单点登录的方式就需要解决两个问题,一是子系统的SESSION
是相互隔离的问题,二是用户的SESSION-ID
如何在客户端共享的问题。
SESSION
的一致性的解决方案主要有SESSION
同步、SESSION
集中存储的方式,SESSION
同步比较消耗资源,所以一般还是使用SESSION
集中存储的方式。
对于SESSION-ID
在客户端共享的问题,SESSION-ID
主要还是存储在COOKIE
中,所以需要解决的问题是COOKIE
的跨域问题,对于同一个顶级域名下的二级域名,可以通过在SET-COOKIE
时设置domain
属性为顶级域名,即可实现在顶级域名与二级域名三级域名下的COOKIE
共享,若是需要非子域名下的COOKIE
共享,可以考虑使用P3P
隐私参考项目平台Platform for Privacy Preferences
的header
的方式跨域SET-COOKIE
。
Ticket
方式也称为SSO-Token
,其是一个用户身份的标识,这个标识在所有子系统群中是唯一的,并且所有的子系统SERVER
都可以验证这个Token
并同时能够拿到这个Token
所代表的用户信息,同样这种方式也需要解决COOKIE
的跨域问题,同样一般也是需要使用顶级域名的domain
属性或者P3P
的header
的跨域SET-COOKIE
。
CAS
中央认证服务Central Authentication Service
,将认证服务单独抽出作为一个子系统,所有的登录认证服务都在CAS
认证中心进行。CAS
系统像是一个中转中心,可以认证所有用户的身份,同样也可以直接通过在CAS
系统登录后以登录态跳转到其他各个系统。
假如我们存在三个子系统,A
系统A.com
、B
系统B.com
、认证服务SSO.com
,当用户已经注册,登录时的主要流程:
A
,此时用户未登录,系统自动跳转到认证服务系统SSO.com
并携带参数存储跳转地址A.com
。SSO.com
输入账号密码,点击登录验证成功后,中央认证服务器返回一个Ticket
,并将已经登录的COOKIE
写入SSO.com
认证服务的域名下,SSO.com
认证服务重定向至跳转到认证服务时携带的地址,也就是上一步的A.com
,并携带中央认证服务端下发的Ticket
。A
得到Ticket
并向本系统的服务器传递Ticket
,服务端验证Ticket
无误后获取Ticket
中携带的用户信息,并设置当前A
系统的此用户为登录态,下发COOKIE
信息等用户凭据,至此该用户可正常使用A
系统的服务。B
系统,由于用户未在B
系统登录,系统自动跳转到认证服务系统SSO.com
并携带参数存储跳转地址B.com
。SSO.com
已经处于登录状态,此时直接从中央认证服务器获取Ticket
,然后重定向至跳转到认证服务时携带的地址,也就是上一步的B.com
,并携带中央认证服务端下发的Ticket
。B
得到Ticket
并向本系统的服务器传递Ticket
,服务端验证Ticket
无误后获取Ticket
中携带的用户信息,并设置当前B
系统的此用户为登录态,下发COOKIE
信息等用户凭据,至此该用户可正常使用B
系统的服务。