单点登录 单点登录(SSO - Single Sign On):对于同一个客户端(例如 Chrome 浏览器),只要登录了一个子站(例如 a.com),则所有子站(b.com、c.com)都认为已经登录。 比如用户在登录淘宝后,跳转到天猫时就已经登录了。 用例步骤 未登录用户访问子站 a.com 进行登录,自动跳转到账 ..

跨域 Cookie 实现单点登录

本贴最后更新于 1953 天前,其中的信息可能已经天翻地覆

单点登录

单点登录(SSO - Single Sign On):对于同一个客户端(例如 Chrome 浏览器),只要登录了一个子站(例如 a.com),则所有子站(b.com、c.com)都认为已经登录。

比如用户在登录淘宝后,跳转到天猫时就已经登录了。

用例步骤

  1. 未登录用户访问子站 a.com 进行登录,自动跳转到账户中心的统一登录页 account.com/login
  2. 用户在统一登录页进行登录,登录成功后显示登录跳转页
  3. 显示登录跳转页后自动跳转回 a.com,单点登录完成
  4. 用户在访问 b.com 时无需再次登录

实现原理

登录

  1. 统一登录页登录请求完成后响应为登录跳转页
  2. 登录跳转页中通知各子站进行登录
     
  3. 子站收到登录请求后验证 token 是否有效,有效的话在响应中设置 cookie(user_token=xxxx

token 验证

登出

  1. 用户在某个子站主动登出时跳转到账户中心统一登出页 account.com/logout?uid=xxxx&token=xxxx
  2. 账户中心验证 token 后进行登出,在登出跳转页中通知各子站进行登出(设置 cookie),类似登录通知
  3. 子站收到登出请求后验证 token 是否有效,有效的话在响应中设置 cookie(删除 user_token)

关键点

  • Cookie
    15 引用 • 59 回帖
  • 跨域
    13 引用 • 72 回帖
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    8 引用 • 25 回帖
16 回帖
请输入回帖内容...
  • slamyangbiao

    版主。。这个有木有详细点的介绍啊。

  • 88250

    @slamyangbiao 这个是关键点,有疑问欢迎提出

  • slamyangbiao

    @88250 为什么要做 sso 啊。。直接把 session 放到同一的 Redis。。。然后 cookie 支持跨域。。。不更好吗?

  • 88250

    @slamyangbiao cookie 不支持跨域的嘛, a.com 和 b.com 不是一个 cookie

  • slamyangbiao

    @88250 可以二级域名跨域嘛。。。。一般需要同一用户的公司系统都是使用二级域名去区分。

    做 sso 的话。。这么一个个去调用登陆。。是不是不太优雅。。哈哈。。而且各系统的用户数据怎么统一?

  • 88250

    @slamyangbiao 如果一个域名的话,都设置到裸域上面就行了。这个方案是解决不同域名的跨域登录,至于后端数据架构不在本案设计范围之内 😂

  • slamyangbiao

    @88250 这样会比集成 cas 复杂吗?

  • 88250

    @slamyangbiao 比那套简单很多,单点登出也好控制

  • slamyangbiao

    @88250 这个账户中心有没有开源的实现啊。。?

  • 88250

    @slamyangbiao 这套方案是公司内部用的,目前没有开源。.

  • slamyangbiao

    @88250 你们的方案中 token 校验,子系统是不需要去用户中心校验的?只需要用公钥解密 token 然后对比?

  • 88250

    @slamyangbiao 要校验的,每个请求都需要校验

  • Snake API

    写的很清晰、受教了!

  • Jackson

    如果我把生成的存放 token 的 cookie 导入到其他浏览器,那么其他浏览器也是登录状态吗?

    1 回复
  • 88250

    只要服务端能识别该 Cookie 就行了。

  • linker

    要不要考虑下 CoRS 跨域?

请输入回帖内容 ...