Skip to content

单点登录的两种实现方案

传统的登录方案中,用户每访问一个站点都需要先输入用户名密码进行登录。当这些站点接入单点登录(Single Sign On, SSO)系统之后,用户只需要在第一次访问的站点中登录一次,那么用户对其它接入该SSO系统的站点就都拥有了访问权限。

null

同源策略

在设计单点登录系统之前,需要搞清楚浏览器的同源策略

  1. cookie在不同域名下不能共享。如a.com的站点不能访问b.com的cookie,也不能为b.com设置cookie
  2. 子域名可以设置父域名(eTLD除外)的cookie,也可以访问父域名的cookie,即父域cookie被所有子域共享

基于认证中心的标准实现方案

用户首次访问时,需要在认证中心登录:

null
  1. 用户访问网站a.com下的pageA页面
  2. 由于没有登录,则会重定向到认证中心,并带上回调地址sso.com?redirect=a.com/pageA,以便用户登录之后能跳转回来
  3. 用户在认证中心输入账号密码,提交登录。
  4. 认证中心验证账号密码有效,然后重定向到a.com/pageA?ticket=T123并带上授权码ticket,并将认证中心sso.com的登录态写入Cookie。
  5. 在a.com的服务器中,拿着ticket向认证中心确认,授权码ticket真实有效。
  6. ticket验证成功后,a.com将登录信息写入自己域名下的cookie中。

用户访问接入了认证中心的其它服务时:

null

认证中心发现自己的域名下已经有了cookie,说明之前用户已经有效登录过了,所以直接将新的ticket带到b.com,b.com拿该ticket验证用户信息后种下自己的cookie

基于父域cookie共享的实现方案

该方案需要确保所有的服务都在同一父域名下,如a.baidu.com, b.baidu.com, c.d.baidu.com等,由于任一子服务可以将cookie种到baidu.com域名下,所以一个服务登录之后,只需要各子服务器能够共享登录态,其它服务就不需要再次登录了。

null

登录服务也可以用一个专门的服务提供,如oa.baidu.com,这样不需要每个子域服务都开发登录功能。

Last updated: