1. 单点登录指的是在公司内部搭建一个公共的认证中心,公司下的所有产品的登录都可以在认证中心里完成,一个产品在认证中心登录后,再去访问另一个产品,可以不用再次登录,即可获取登录状态

🥈 SSO 机制实现流程

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

  1. 1. 用户访问网站 a.com 下的 pageA 页面。
  2. 2. 由于没有登录,则会重定向到认证中心,并带上回调地址 www.sso.com?return_uri=a.com/pageA,以便登录后直接进入对应页面。
  3. 3. 用户在认证中心输入账号密码,提交登录。
  4. 4. 认证中心验证账号密码有效,然后重定向 a.com?ticket=123 带上授权码 ticket,并将认证中心 sso.com 的登录态写入 Cookie
  5. 5. a.com 服务器中,拿着 ticket 向认证中心确认,授权码 ticket 真实有效。
  6. 6. 验证成功后,服务器将登录信息写入 Cookie(此时客户端有 2 Cookie 分别存有 a.com sso.com 的登录态)。

image.png
认证中心登录完成之后,继续访问 a.com 下的其他页面:

  1. 1. 这个时候,由于 a.com 存在已登录的 Cookie 信息,所以服务器端直接认证成功。

image.png
如果认证中心登录完成之后,访问 b.com 下的页面:

  1. 1. 这个时候,由于认证中心存在之前登录过的 Cookie,所以也不用再次输入账号密码,直接返回第 4 步,下发 ticket b.com 即可。

image.png

🥇 SSO 单点登录退出

目前我们已经完成了单点登录,在同一套认证中心的管理下,多个产品可以共享登录态。现在我们需要考虑退出了,即:在一个产品中退出了登录,怎么让其他的产品也都退出登录?
原理其实不难,可以回过头来看第 5 步,每一个产品在向认证中心验证 ticket 时,其实可以顺带将自己的退出登录 api 发送到认证中心。
当某个产品 c.com 退出登录时:

  1. 1. 清空 c.com 中的登录态 Cookie
  2. 2. 请求认证中心 sso.com 中的退出 api
  3. 3. 认证中心遍历下发过 ticket 的所有产品,并调用对应的退出 api,完成退出。