单点登录的核心思路是客户端存储AuthToken,服务端存储登录信息。由于客户端将AuthToken存储在Cookie中,所以要解决Cookie的跨域读写问题。
回顾Cookie的路径(path)和域(domain)
cookie路径
cookie 一般都是由于用户访问页面而被创建的,可是并不是只有在创建 cookie 的页面才可以访问这个cookie。在默认情况下,出于安全方面的考虑,只有与创建 cookie 的页面处于同一个目录或在创建cookie页面的子目录下的网页才可以访问。那么此时如果希望其父级或者整个网页都能够使用cookie,就需要进行路径的设置。
cookie域
domain表示的是cookie所在的域,默认为请求的地址,如网址为www.jb51.net/test/test.aspx,那么domain默认为www.jb51.net。而跨域访问,如域A为t1.test.com,域B为t2.test.com,那么在域A生产一个令域A和域B都能访问的cookie就要将该cookie的domain设置为.test.com;如果要在域A生产一个令域A不能访问而域B能访问的cookie就要将该cookie的domain设置为t2.test.com。
解决跨域的核心思路
1、跨域登录,通过将AuthToken传递给非主域名的站点,将AuthToken保存在当前域下的Cookie中。
2、跨域登出,调用非主域名站点的登出页面,完成设置Cookie中的AuthToken过期的操作。
注:图片来源:https://ken.io/note/sso-design-implement
跨域登录(主域名已登录)
访问业务站点时,跳转到SSO站点做登录状态校验,验证通过后,返回302重定向到非主域名的站点,将AuthToken保存在当前域下的Cookie中,最后跳转回业务站点。

跨域登录(主域名未登录)
主体思路一样,只是第一步是跳转到SSO做登录操作。

跨域登出
请求登出时,也需要跳转到SSO站点,验证通过后,SSO站点清除存储的登录信息,并且返回302重定向到非主域名,设置客户端的AuthToken过期,最后跳转回业务站点。
