什么叫做 SSO
本文写于 2020 年 12 月 8 日
SSO 的全称叫做 Single Sign On,意味「单点登录」。
何为单点登录?就是你希望自己的两个网站,可以做到:一个网站登录了,另一个就不需要再次登陆了。例如淘宝和天猫,你只需要登陆一次即可。
用专业一点的话来讲,即:在多个系统中,用户只需一次登录,各个系统即可感知该用户已经登录。
单系统的登陆
HTTP 是一个无状态的协议,也就是服务器压根儿不知道你是否登陆了。因此我们需要给用户发一个“通行证”,也就是 Cookie,用户每次都会带上 Cookie 让服务器得以确认一些信息。通常我们会在服务器维护一个 Session 对象,里面存了登陆用户的 SessionId,当用户退出登陆后就移除 Session 对象中的对应 Id。
-
登录: 将用户信息保存在 Session 对象中。
- 如果在 Session 对象中能查到,说明已经登录。
- 如果在 Session 对象中查不到,说明没登录(或者已经退出了登录)。
- 退出登录: 从 Session 中删除用户的信息。
- 关闭重新打开浏览器后还能保持登录: 使用 Cookie 来达成该功能。
多系统登陆
Session 不共享
上面的方法在单系统下是没有问题的,但是如果是多系统呢?多系统的 Session 很可能是不共享的呀。
那我们就得做出修改了,首先我们得将 SSO 单独做一个系统,其他的子系统登陆的时候请求 SSO 系统进行登陆。
- SSO 系统生成一个 token,将用户信息存起来,并且设置一个过期时间;
- 其他系统登陆时请求 SSO,SSO 系统返回 token,将其写入 cookie 中;
- 每次请求时,前端会带上 cookie,拦截器得到了 token 之后,就能判断其是否登陆了。
Cookie 无法跨域
但是,cookie 不能跨域呀。Session 不能共享的问题解决了,cookie 的问题呢?
有三种解决方案:
- 服务端将 Cookie 写到客户端后,客户端对 Cookie 进行解析,将 Token 解析出来,此后请求都把这个 Token 带上就行了
- 多个域名共享 Cookie,在写到客户端的时候设置 Cookie 的 domain
- 将 Token 保存在 SessionStorage 中(不依赖 Cookie 就没有跨域的问题了)
(完)