跨域 Cookie 实现单点登录

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

单点登录

单点登录(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 验证

  • 账户中心使用私钥加密 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 时可以考虑使用账户中心提供高性能的验证接口,子站进行调用
  • Cookie
    21 引用 • 63 回帖
  • 跨域
    18 引用 • 95 回帖
  • 单点登录

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

    9 引用 • 25 回帖 • 8 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 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 要校验的,每个请求都需要校验

  • someone

    写的很清晰、受教了!

  • Jackson

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

    1 回复
  • 88250

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

  • linker

    要不要考虑下 CoRS 跨域?

请输入回帖内容 ...