聊聊阿里淘宝SSO跨域登录过程

场景:你在访问淘宝首页之后,需要登录,当你登录成功之后,再去访问天猫,你会发现,天猫也是登录状态,这是怎么做到的?

好吧~介绍阿里的 SSO 机制之前,建议移步至 Cookie 和 Session 先普及一下 Cookie 和 Session 机制。接下再介绍三个概念叫 访问控制SSO权限系统

访问控制(Access Control)

访问控制要完成的两个任务:1.识别和确认访问系统的用户;2.决定该用户可以对某一系统资源进行何种类型的访问

SSO(Single Site On)

让用户能够通过一次登录访问所有应用程序。它提供一个统一的机制来管理用户的身份验证,并实现业务规则来决定用户对应用程序和数据的访问。

权限系统

这里主要对阿里的体系作介绍 —— 统一登录(分布式 Session) + 接口鉴权

SSO系统集群部署后,面临的首要问题就是Session的共享问题,比如用户在sso-1 机器上登录了,下次访问sso-2机器时,也必须是登录态的。分布式Session使用较多的方案为:Session集中管理;比如阿里巴巴基于Tair 缓存体系的共享session体系tbsession。如果采用了session + cookie的方案,并且服务端集群是多域名共享登录的话,那么还需要提供cookie跨域同步的能力(解决cookie不能跨域的问题)。

测试过程:

  1. 访问 www.taobao.com 请求登录跳转至 login.taobao.com
  2. 用户输入用户名和密码使用 POST 请求提交表单信息到 login.taobao.com
  3. 登录成功后,response status为 302,redirect(重定向)至 www.taobao.com
  4. 访问 www.tmall.com 页面响应中发起新的请求 tmcc.tmall.com/pass.htm
  5. tmcc.tmall.com/pass.htm 的响应 302 至 login.taobao.com/jump?target=https://tmcc.tmall.com/pass.htm?tbpm=1(tbpm 为 1 表示:进行 tbsession 的跨域同步)
  6. 请求 login.taobao.com/jump?target=https://tmcc.tmall.com/pass.htm?tbpm=1 的时候,会携带上 taobao.com 域下的 Cookie 信息,服务端把 taobao.com 域下的 Cookie 信息拼接到 https://pass.tmall.com/add?tb_token=eef03e35fbe&u……&target=https%3A%2F%2Ftmcc.tmall.com%2Fpass.htm%3Ftbpm%3D1 的 query string 上 302 重定向
  7. 请求页面 https://pass.tmall.com/add?tb_token=eef03e35fbe&u……&target=https%3A%2F%2Ftmcc.tmall.com%2Fpass.htm%3Ftbpm%3D1,携带 taobao 的 Cookie 信息的 query string 参数请求 tmall.com 下的信息,添加 Cookie
  8. 响应中把请求中的 Cookie 信息 Set 到浏览器的 Cookie 中,经由 302 重定向至 https://tmcc.tmall.com/pass.htm?tbpm=1,这样就完成了 tmall.com 域名下的 Cookie 同步
  9. 请求 https://tmcc.tmall.com/pass.htm?tbpm=1 302 跳转至 https://tmcc.tmall.com/pass.htm 去掉同步标识 tbpm

总结一下,上图

image

  1. 请求 tmall.com 的响应会重定向至请求 tmcc.tmall.com/pass.htm,由此 URL 再通过跨域请求至 login.taobao.com/jump?target=https://tmcc.tmall.com/pass.htm?tbpm=1
  2. 在这里,就是因为 tbpm=1 的标识,可以进行 tbsession 的跨域同步,这个请求中会携带 taobao.com 域下的 Cookie
  3. 服务端将携带的 taobao.com 的 Cookie拼接到 https://pass.tmall.com/add?tb_token=eef03e35fbe&u……&target=https%3A%2F%2Ftmcc.tmall.com%2Fpass.htm%3Ftbpm%3D1 下的 query string 上
  4. 浏览器拿到这个响应将 Cookie Set 进浏览器的 Cookie 中,然后重定向至 https://tmcc.tmall.com/pass.htm?tbpm=1
  5. 再重定向至 https://tmcc.tmall.com/pass.htm 去掉同步标识 tbpm