D 的个人博客

开源程序员,自由职业者

小而美的 Java 博客系统 Solo
Golang 在线 IDE Wide
黑客与画家的社区 Sym
  menu
402 文章
1,949 评论
3434575 浏览
3 当前访客
ღゝ◡╹)ノ❤️

跨域 Cookie 实现单点登录

单点登录

单点登录(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. 登录跳转页中通知各子站进行登录
    <script src='b.com/login?uid=xxxx&token=xxxxx'></script>
    <script src='c.com/login?uid=xxxx&token=xxxxx'></script>
  3. 子站收到登录请求后验证 token 是否有效,有效的话在响应中设置 cookie(user_token=xxxx)

token 验证

  • 账户中心使用私钥加密 user id,生成 token
  • 子站使用公钥解密 token,将得到的 user id 和参数 uid 对比,如果一样就是校验通过

登出

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

关键点

  • 浏览器渲染登录跳转页时将执行上面用 <script> 发送的登录通知请求,执行完后(或者超时)才跳转回前面登录的子站
  • 登录通知请求是跨域的(当前域是账户中心 account.com),所以在响应中设置 cookie 时 IE 某些版本需要设置 P3P 头
  • 在验证 token 时可以考虑使用账户中心提供高性能的验证接口,子站进行调用

评论
  • 要不要考虑下 CoRS 跨域?

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

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

    Reply
  • 写的很清晰、受教了!😂😂

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

    Reply
  • slamyangbiao

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

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

    Reply
  • slamyangbiao

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

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

    Reply
  • slamyangbiao

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

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

    Reply
  • slamyangbiao

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

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

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

    Reply
  • slamyangbiao

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

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

    Reply
  • slamyangbiao

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

    Reply