SSO 与 CAS
0X00 网站怎么登陆
回忆一下你用过的网站们,一般都是怎么登陆的? “就输入用户名密码登陆呗,要么就扫码登录,要么手机验证码登录,还能有啥”。确实没啥,咱们平时用到的登录方式也就都是这样的,而且这些其实从原理上来说都是 证明你是你 的手段,用户名密码是通过“密码只有你自己知道”为前提的,扫码和验证码是以“手机一定在你自己手上,并且只有你自己能解锁”为前提的。所以其实用户名密码并不是登录的唯一方法,理论上能证明你是你的一切方法都可以用来做授权认证,所以我们可以看到除了密码,出现了扫码、短信邮箱验证码、指纹、人脸、声纹、虹膜巴拉巴拉的。
上面这些都是稳定靠谱的登录方式,我们来想另一个问题,你们有一个网站选用了用户名密码的方式登录,你和用户开开心心登录。后来你上线了另一个网站,你觉得用户该怎么登陆这个新网站呢?“新网站就再注册一次呀!”好的,用户又注册了一次。随着你们公司业务逐渐壮大,上线了 100 个网站,那用户要注册一百次吗?万一自己常用的用户名被占用了呢,岂不是 100 个网站可能会用 100 套不同的用户名密码?那用户可能就要骂娘了呦。
聪明的你可能会想到,既然现在这么流行微服务,我们把登录做一个微服务,所有系统的登陆都用这一套不就好了?
0X01 这就是 SSO
那有一个好消息和一个坏消息,坏消息是,你以为的这个天才想法就是 SSO(Single Sign On)单点登录,早就被人想到而且实现了很多遍了;好消息是,轮子很多,完全不用自己造,挑一个拿来用就好。
单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一退出(single sign-off)就是指,只需要单一的退出动作,就可以结束对于多个系统的访问权限。 –维基百科
SSO 简单来说就是当你有一堆系统需要登录的时候,通过一个登录服务将所有系统统筹起来的方案。在不用 SSO 的时候,登录一个系统是这样的:
- 打开网站 A
- A 网站发现你没有 token 或者 cookie,要求你登录
- 你输入用户名密码传递给 A 网站
- A 网站通过核对发现用户名密码正确,给你下发一个 token 或者 cookie
- 你带着 token 或者 cookie 就可以正常访问了
如果你要登录一家公司的 3 个系统,那就得重复上面流程三次,如果密码输入错了或者记混了用户名密码和网站的联系可能还会登录好多次。SSO 的存在不能解决你登陆一个系统的问题,但是能解决你登录多个系统的问题。
通常来说 SSO 的工作流程是这样的
- 打开网站 A
- A 网站发现你没有 token 或者 cookie,要求你登录,给你一个 302 跳转到 SSO 站点
- 你把用户名密码发给 SSO
- SSO 认证通过后发给你 token,并且再通过 302 给你跳回刚才的网站
- 后面你就可以带着 token 正常访问了
乍一看好像一步都没有少,反而程序上的实现还更复杂了,但是 SSO 的优势就在于再登录新系统的时候。如果这时候你要登录这家公司的 B 系统,在没有 SSO 的情况下就得重复上面的步骤,而且你还得重新输入用户名密码。但是在有 SSO 的情况下是这样的:
- 你打开网站 B
- B 网站发现你没有 token,要求你登录,给你一个 302 跳转到 SSO 站点
- SSO 站点是同一个,所以你会带着 token 访问 SSO,这时候 SSO 就知道你登陆过了,就会给你一个用于网站 B 的 token,并且 302 跳转过去
- 你带着 token 正常访问 B 网站
从条数上看没少什么,但是你会发现真正你人工在操作的就只是“打开 B 网站”而已,后面的都是程序在跳转。这样不仅成功实现了一套用户名面走天下的方案,还成功地给用户减小了登录多个系统的麻烦。
0X02 CAS-SSO 如何工作
那么 CAS 又是什么呢?
集中式认证服务(英语:Central Authentication Service,缩写CAS)是一种针对万维网的单点登录协议。它的目的是允许一个用户访问多个应用程序,而只需向认证服务器提供一次凭证(如用户名和密码)。这样用户不仅不需在登陆web应用程序时重复认证,而且这些应用程序也无法获得密码等敏感信息。“CAS”也指实现了该协议的软件包。 –维基百科
也就是说,CAS 是 SSO 的一种实现方式。它的工作流程是这样的:
- 用户访问站点 A
- 网站 A 将请求重定向 CAS 服务器
- 用户在 CAS 处输入用户名密码,提交
- CAS 认证通过,给用户发一个 token,并重定向回站点 A
- 用户将 CAS 给的 token 带到站点 A
- 站点 A 将 token 拿去 CAS 服务器核查(因为 站点 A 现在不知道用户是谁,自己也识别不了 token)
- CAS 服务器核查通过,并将用户 A 的信息返回给站点 A(这时候站点 A 知道用户是谁了)
- 登录成功,可以正常使用 token 访问站点了