原稿:语雀 · 单点登录 · 原目录:面向面经学习 › 智力题 & 场景题 › 单点登录

将所有站点都设置一个主域名,如 *.baidu.com,所有站点设置 cookie 时都指明 domain: baidu.com,这样 domain 及其子域可以实现 cookies 共享,只需要将登录后的验证信息放入 cookie 即可。这种方法下,server 端要求语言平台一致,同时 cookie 有其不安全性

CAS 系统

参考链接:单点登录(SSO)看这一篇就够了

整体流程见图片

假如有两个不同域名的网站,http://app1.comhttp://app2.com,此时可借助 sso.com 实现登录状态管理

首次访问 app1 2. 用户访问 app1.com,对应域的 cookie 无登录信息,判断用户未登录 4. 跳转到 sso.com,sso.com cookie 无登录信息(TGT),cas 系统也没有登录,弹出用户登录页,用户信息认证后,生成 ticket granting ticket(TGT),将其放入 sso.com 的 cookie,同时生成一个 service ticket(ST),假设生成了 st1 6. 然后跳转回 app1,同时在参数中传递 st1,app1 拿到 st1 后,从后台向 cas 系统发送请求,验证 st1 是否有效,验证通过后,生成登录状态信息响应给 app1.com(比如 session_id),app1.com 将登录状态存在该域下的 cookie 中

再次访问 app1

app1.com 的 cookie 中有登录验证信息,与 app1 server 中信息匹配后通过 app1 的验证

访问 app2 2. 用户访问 app2.com,对应域的 cookie 无登录信息,判断用户未登录,同样跳转到 sso.com 4. 此时 sso.com 的 cookie 中有 TGT,因此直接生成一个 st2 6. 跳转回 app2.com,参数中传递 st2,app2 拿到 st2 后,从后台向 cas 系统发送请求,验证 st2 是否有效,验证通过后,生成登录状态信息响应给 app2.com(比如 session_id),app2.com 将登录状态存在该域下的 cookie 中

小结

  • 用户输入的内容只会参与 cas 登录的验证,业务系统不会参与
  • cas 的 cookie 中主要存放 TGT,业务系统 cookie 中存放的是登陆状态
  • ST 由 cas 系统下发且不会保存在业务域的 cookie,为了避免用户伪造 ST,必须在正式登录业务系统前向 cas 验证 ST