SSO

SSO 是英文 Single Sign On 的缩写,翻译过来就是单点登录。顾名思义,它把两个及以上个产品中的用户登录逻辑抽离出来,达到只输入一次用户名密码,就能同时登录多个产品的效果。

就好比我们去游乐园玩,买了通票之后,在里面玩火山车,摩天轮等单独项目都不需要再次买票了。

使用 SSO 的优点:

  1. 提升用户体验。
    就以百度为例。百度有很多产品,假如你是百度用户,肯定无法忍受登录百度贴吧的时候输入一次用户名密码,登录百度网盘又要输入一次用户名密码吧?
  2. 避免重复开发。
    假如你是百度后端开发,每天任务都饱和的不行,肯定无法忍受到百度贴吧项目开发一套登录逻辑,到网盘项目又开发一套登录逻辑吧?
  3. 提升安全系数。
    假如你是百度运维,发现了一个安全隐患需要紧急修复。你肯定无法忍受给茫茫多的产品后端都发一封邮件,责令修复吧?万一漏了一个呢?

综合看来,SSO 不仅是有用的,而且是必要的。

不同场景的SSO

同域 SSO

同域 SSO 是最简单的一种情况。

此时,两个产品都是在一个域名下,单点登录是很自然的选择。我们来捋一捋步骤:

  1. 用户访问产品 a,向 后台服务器发送登录请求。
  2. 登录认证成功,服务器把用户的登录信息写入 session。
  3. 服务器为该用户生成一个 cookie,并加入到 response header 中,随着请求返回而写入浏览器。该 cookie 的域设定为 https://itudo.cn
  4. 下一次,当用户访问同域名的产品 b 时,由于 a 和 b 在同一域名下,也是 https://itudo.cn,浏览器会自动带上之前的 cookie。此时后台服务器就可以通过该 cookie 来验证登录状态了。

同父域 SSO

同父域 SSO 是同域 SSO 的简单升级,唯一的不同在于,服务器在返回 cookie 的时候,要把cookie 的 domain 设置为其父域。

比如两个产品的地址分别为 http://a.dxy.cnhttp://b.dxy.cn,那么 cookie 的域设置为 http://dxy.cn 即可。在访问 a 和 b 时,这个 cookie 都能发送到服务器,本质上和同域 SSO 没有区别。

跨域 SSO

可以看到,在上面两种情况下,我们都没有专门设置 SSO 服务器。但是当两个产品不同域时,cookie 无法共享,所以我们必须设置独立的 SSO 服务器了。这个时候,我们就是通过标准的 CAS 方案来实现 SSO 的

CAS

SSO 仅仅是一种架构,一种设计,而 CAS 则是实现 SSO 的一种手段。两者是抽象与具体的关系。当然,除了 CAS 之外,实现 SSO 还有其他手段,比如简单的 cookie。

CAS是将单独的登录系统抽取出来,现在假设我们有两个系统www.tudouA.com和www.tudouB.com,以及抽取出来的登录系统(www.tudouSSO.com),假设我们的系统都需要登录才能访问。

首先,用户想要访问系统A(www.tudouA.com),系统A(www.tudouA.com)发现用户并没有登录,于是重定向到sso登录系统(www.tudouSSO.com),并将自己的地址作为参数。请求的地址如下:

www.tudouSSO.com?service=www.tudouA.com

sso认证中心发现用户未登录,将用户引导至登录页面,用户进行输入用户名和密码进行登录,用户与认证中心建立全局会话

随后,认证中心重定向回系统A,并把Token携带过去给系统A,重定向的地址如下:

www.tudouA.com?token=xxxxxxx

接着,系统A去sso认证中心验证这个Token是否正确,如果正确,则系统A和用户建立局部会话(创建Session)。到此,系统A和用户已经是登录状态了。

此时,用户想要访问系统B(www.tudouSSO.com),系统B(www.tudouB.com)发现用户并没有登录,于是重定向到sso登录系统(www.tudouSSO.com),并将自己的地址作为参数。请求的地址如下:

www.tudouSSO.com?service=www.tudouB.com

注意,因为之前用户与登录系统(www.tudouSSO.com)已经建立了全局会话(当时已经把Cookie保存到浏览器上了),所以这次系统B重定向到登录系统(www.tudouSSO.com)是可以带上Cookie的。

登录系统根据带过来的Cookie发现已经与用户建立了全局会话了,登录系统重定向回系统B,并把Token携带过去给系统B,重定向的地址如下:

www.tudouB.com?token=xxxxxxx

接着,系统B去sso登录系统验证这个Token是否正确,如果正确,则系统B和用户建立局部会话(创建Session)。到此,系统B和用户已经是登录状态了。

看到这里,其实SSO认证中心就类似一个中转站。

Last modification:June 2nd, 2020 at 11:37 am
如果觉得我的文章对你有用,请随意赞赏
评论打卡也可以哦,您的鼓励是我最大的动力!