不少互联网公司会有多个域名。这多是由于公司并购,好比百度持有baidu.com、nuomi.com、qianqian.com等;也多是为不一样业务启用了不一样的域名,好比阿里持有taobao.com、tmall.com等。git
若是咱们将用来实现登陆接口的域名称之为主域名,其它域名称之为从域名,好比对百度来说主域名是baidu.com,对阿里来说主域名是taobao.com。那么用户在主域名登陆后,自动将登陆态同步到从域名,就成为一个很天然的需求。本文介绍如何安全高效地实现这种跨域名的登陆态传递。github
所谓push指的是主域名登陆后,在主域名的页面下经过访问从域名的sso接口种cookie,将登陆态“推送”到从域名;web
主域名登陆后,访问主域名sso接口获取token,而后将token拼接到query string中访问从域名下的sso接口,从域名的sso接口验证token并其对应的登陆态标识种到从域名下的cookie中。跨域
须要注意的是,因为约束2的存在,访问从域名的sso接口时,除非跳转页面或弹窗,不然在safari和firefox下因种三方cookie的行为被禁止,登陆态没法传递成功;浏览器
pull指的是访问从域名的页面时,可访问主域名的sso接口,该接口依据主域名的登陆态建立sso token,随后校验referer再跳转到对应从域名的sso接口。从域名的sso接口验证token并其对应的登陆态标识种到从域名下的cookie中。这样就实现了将主域名的登陆态“拉取”到了从域名下。安全
pull方案能够知足本文开头提出的三个约束,缺点是非登陆相关页面也将包含登陆态传递逻辑。cookie
跨域名sso主要涉及到一些cookie的知识点,不清楚的能够看这篇文章。建议同时实现push和pull两种方案。firefox