前言: 单点登录,即用户在站点A 登录以后,无需登录 站点 B、站点 C、站点 D 以此类推,往往这些网站都有一个共同的验证中心,下面介绍单点的几种方式
参考:前后端分离单点登录SSO实现方案 淘宝、京东跨域获取Cookie、OAuth2、QQ客户端多种模式_Exrick的博客-CSDN博客
前后端分离下单点登录实现的几种方式
1. 共享Cookie模式
①: 即 多个站点公用一个根域名,例如验证中心的地址是 www.Test.com, 那么 实现单点登录的站点必须为子域名,即 aaa.Test.com,bbb.Test.com,ccc.Test 等。
②:用户登录以后将 ticket 存储在根域名和子域名的 Cookie 中,这样其他的子域名也能共享到这个 Cookie,如此以来即可实现单点登录
2. OAuth2.0模式
①: 站点 A 发现用户未登录, 跳转到登录验证中心,登录成功后,验证中心会带着 ticket 跳转到 站点 A,同时将此 ticket 作为key, ticket 对应的身份 作为value 存入数据库(Redis)
② :验证中心将 ticket 写入cookie(此时写入的cookie 位于验证中心)
③ : 站点 B 发现用户未登录,跳转到登录验证中心,
④: 验证中心发现有 cookie 缓存(即验证中心这个站点自身的 cookie),则判断 cookie 中的 ticket 的有效性,判断成功以后,带着此 ticket 跳转到 站点 B 的页面
⑤: 任意一个站点用户注销登录后,都要调用 验证中心 的作废 ticket 的接口
(ticket 可以用Guid 或者其他的加密方式得到的唯一值)
3. 跨域设置Cookie模式
这个就比较的简单粗暴了,
①: 集群下的 任何一个站点都要提供一个 设置 cookie 的接口
② : 集群下的任何一个站点登录以后,都要调用其他站点的 设置刷新 cookie 的接口,以保持用户信息同步
以上方式获取到的 凭据,往往最后在站点 B,站点 C 等具体的系统中还需要去调用验证中心的接口,获取用户的更详细的信息(类似以集群下的站点都会获得一个身份证号,想要获取 姓名、户籍、名族这些详细的信息,还要去调用具体的接口才能实现)
注意: 所有的SSO都是基于浏览器来的,不可能在Edge浏览器登录了 ,在 Chrome 浏览器不用登录