«

网站会员跨域同步登录解决方法概略

时间:2021-6-30 10:13     作者:MissHu     分类: 代码


网站会员跨域同步登录解决方法概略

问题描述:两个或多个网站使用相同的会员资料,实现多个网站的同步登录。
  网上看到一篇关于搜狐解决这个问题的方法,登录新浪通行证会同时登录17173.com、chinaren.com、focus.cn、sohu.com等多个网站。由于passport.sohu.com的登录界面使用了iframe隐藏提交。所以页面没有看到刷新。服务器看到成功登录的Cookie后。在服务器端计算出一个加密后的17173.com的登录Url,并Redirect到这个Url。估计这个方案是由于搜狐的数据库结构决定的,网站数量比较多的话,服务器压力会比较大。
  另外介绍的一种方法,属于轻量级的解决方案,登录成功的同时在登录网页中使用JS调用,把加密后的参数传过去,这个不需要页面刷新。在Firefox下可以直接实现跨域的COOKIE读写,但IE和Safari浏览器会因为安全问题,不被信任而拒绝读写。如需要写入需要在页面头部加入下面这个声明,Ucenter使用就是这种方法实现同步登录。

header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');

  在实际测试当中,发现当在IE浏览器中写入的COOKIE值非空时,可以正常读写;但是当设置为空的时候会发生无法写入的情况。我测试的DISCUZ 7.2版以及7.0版都存在这个问题,跨域在IE中无法实现同步登录,后来发现是由于无法跨域清空COOKIE造成的。于是把原本跨域清空的地方,设置为写入0这个值,成功实现同步登录。
  在DISCUZ 7 实现同步登录使用的是api目录中的uc.php文件。同步登录使用的是synlogin函数,同步登出使用的是synlogout函数。下面是同步登录函数的修改。
synlogin函数修改前的代码

synlogin函数修改后的代码

  同步登出修改方式类似,写入非空的值即可。使用IFRAME调用跨域网页时候,COOKIE也存在这个问题。不能写入空值具体原因不详,但修改后在IE下成功实现跨域同步登录和登出。若阁下有好的见解可以留言讨论。

自由转载,转载请注明: 转载自WEB开发笔记 www.chhua.com