什么叫做 SSO

什么叫做 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 不能跨域呀。Session 不能共享的问题解决了,cookie 的问题呢?

有三种解决方案:

  • 服务端将 Cookie 写到客户端后,客户端对 Cookie 进行解析,将 Token 解析出来,此后请求都把这个 Token 带上就行了
  • 多个域名共享 Cookie,在写到客户端的时候设置 Cookie 的 domain
  • 将 Token 保存在 SessionStorage 中(不依赖 Cookie 就没有跨域的问题了)

(完)

上一篇:单点登录SSO


下一篇:sso单点登陆