多域名登录方案思考
场景:
现有3个域,aa.com,bb.com,cc.com,aa.com 是用户中心,login.aa.com 是用户中心的登陆入口,现要求在任何一个域内登录,其他域不用重复登录了。
方案:
我们知道,如果要保证3个域内都同时登陆了,就必须共享登陆的信息,登陆的信息,可以存储在客户端,也可以存储在服务器端,要共享这些信息,就必须要解决多域名下如果同步这些信息的问题,以客户端为例,我觉得有2种办法:
1)对其他的两个域都设置一个login.xx.com 的这么一个子域(设置这个是为了方便管理),在任何一个网站访问,点击登陆的时候,都跳转到用户中心的登陆入口login.aa.com 去登陆,登陆成功后设置登陆状态和验证信息,
将这些信息写到这个域的cookie里面,domain=login.aa.com,所有的aa.com域以及子域都能获取到这个cookie的值,同时向其他的两个域内写这个cookie值,
例如:
<script src="http://login.bb.com/?type=setcookies&s=xxxxxxxxxxxxxxxxxxx">
<script src="http://login.cc.com/?type=setcookies&s=xxxxxxxxxxxxxxxxxxx">
可以通过jsonp的形式,将加密后的登陆信息直接放到其他的域中,
这样其他的两个域以及子域都可以获得这个用户的登陆以及验证信息了,在这两个域名下就不用再继续登陆了。
优点:
在登陆处统一设置登陆相关的cookie,便于统一管理cookie的值以及验证规则,一次登陆,其他的域名下不用再重新登陆了。登出的时候将各个域里面的包含用户信息的cookie值清除掉即可。
缺点:
不可预知性,不能预知还是否有其他的域要添加,如果再增加一个域名,我们需要往这个域内写cookie值,域名比较多的情况下,登陆的时间会有一些长,5个域名之内还好点,总的来说,没有封闭性。同理,
登出也类似需要处理其他的多个域名
2)方案二:访问任何一个网站的时候,也是到login.aa.com 这个登陆入口去登陆,登陆成功后设置登陆用户的信息和验证信息,将这些信息写到cookie中,domain这是为login.aa.com,aa的子域都能获取到cookie的
值,登陆成功后,然后执行跳转 http://login.bb.com/login.php?type=setcookie&value=xxxxxxxxxxxxxx&u=http://bb.com/test.html u为跳转的目的地址 login.bb.com 分析到这个cookie 的值进行存储,然后跳转到http://bb.com/test.html 页面,此事这个页面已经是登陆状态了,这就完成了一个登陆过程,如果在cc.com 的页面访问的时候,例如访问 http://cc.com/test.html 的时候,首先会检查时候存在这个cookie的值,如果这个
值不存在,则发一个跳转请求到http://login.aa.com/login.php?domain=cc.com&u=http://cc.com/test.html,由于这个时候aa.com这个域已经是登陆状态,会取得这个域的cookie值,将这个值组装成一个新的请求,
执行跳转 http://login.cc.com/login.php?type=setcookie&value=xxxxxxxxxxxxxx&u=http://cc.com/test.html , login.cc.com 分析到这个cookie 的值进行存储,然后跳转到http://cc.com/test.html 页面,
这个时候这个页面已经是登陆状态了。这样也完成了cc域的登陆和信息共享
优点:
可控,登陆的时候缩短,不影响登陆,新增加一个域,操作方便
缺点:
登出时也要清除所有域下的cookie的值
欢迎大家拍砖,如果有更好的方案,欢迎探讨。