一、在ucenter里注册第三方网站实用,调试通信成功(细节不表);
二、实现注册同步
1.找到第三方网站的注册函数;用uc_get_user()验证是否用户已在注册;
(1)未注册:继续本地验证,继续第2点;
(2)已注册:检测本地用户是否注册;
[1] 已注册:提示该用户名已注册过,不允许注册;
[2] 未注册:提示该用户已注册,但未本地激活;弹出激活页面;
2.继续本地用户验证(假设成功),把用户未加密的密码用新变量保存(注册ucenter需要原始密码以保证ucenter的其它应用使用);
3.先执行ucenter注册uc_user_register;检测返回结果是否成功;
4.ucenter注册成功;获得uc_id
5.修改本地用户注表,增加一个uc_id字段以保存注册成功返回的uc_id,实现用户的信息的关联(当然也可以用原有用户表id跟uc_id关 联,discuz就是这样处理的本地用户id)
6.把用户信息添加到本地数据库;记得保存uc_id;
三、实现第三方网站登录,同步其他应用也登录
1.找到第三方网站登录代码块,先采用uc_user_login登录密码验证,
2.验证成功用获得的uid跟本地的会员表id关联,查出相应信息,再发送相应本地用户cookie;
3.执行uc_user_synlogin($id);执行同步登录
四、实现共他应用登录,第三方网站也同步登录;
1.找到第三方网站正常登录后所要执行的cookie登录操作代码;
2.找到第三方网站的接口:uc.php;找到synlogin 代码块,参照上一点的代码修改原接口康盛的cookie操作代码;
五、实现其他应用登出,第三方网站也同步登出
登出跟登录的修改要点刚好相反;把原在uc.php的synlogin 注册的cookie操作执行注销就OK
六、实现第三方网站退出,其他实用也退出;
找到第三方网站的退出代码块,执行 uc_user_synlogout();
七、用户信息修改;
找到第三方网站的用户修改资料代码块,缓存用户的密码(未经过加密的);在允行执行修改时先执行uc_user_edit;再执行本地用户资料修改
Ucenter与Discuz相关
1、用户登录discuz,通过logging.php文件中的函数uc_user_login对post过来的数据进行验证,也就是对username和password进行验证。
2、如果验证成功,将调用位于uc_client下client.php文件中的函数uc_user_synlogin,在这个函数中调用 uc_api_post(‘user’, ‘synlogin’, array(‘uid’=>$uid))。
3、然后这个函数后向Ucenter的index.php传递数据,index.php接受传递的数据,获得model为user,action为synlogin的值。
4、然后Ucenter的index.php调用control目录下的user.php类中的onsynlogin方法,通过foreach循环,以javascript的方式通知uc应用列表中开启同步登陆的应用进行同步登录;即通过get方式传递给各个应用目录中api下的uc.php一些数据。
5、uc.php接收通知并处理get过来的数据,并在函数synlogin(位于uc.php中)通过函数_authcode加密数据(默认以UC_KEY作为密钥),用函数_setcookie设置cookie。
6、各个应用用对应的密钥解码上面设置的cookie,得到用户id等数据;通过这个值来判断用户是否经过其它应用登录过,从而让用户可以自动登陆。
应用程序的logging.php ——>uc_client中的client.php——>Ucenter——>应用程序中api/uc.php
其实Ucenter实现同步登陆的原理就是cookie,一个应用登陆成功之后,向Ucenter传递数据,让Ucenter通知其他的应用也设置cookie,这样用户在访问其他应用的时候通过已经设置好的cookie实现自动登陆。了解了Ucenter的同步原理,再遇到无法同步登陆,或者开发一些与UCenter接口的时候就会容易很多。具体代码如下:
关于跨域登陆
1.页面嵌套 JS 跨域请求, 就像康盛的 UCenter 产品一样;
2.让页面依次跳转不同应用的域名来解决跨域问题;
3.Google 一样的, 用户主动请求;
下面是详细:
1. app1, app2, app3 挂接在 UC 上, 用户请求 app1 登录, app1 程序在验证通过同时请求 UC 需要同步登录的代码(如下), 打印到页面上.
<script type="text/javascript" src="http://app2/api/uc.php?time=132 4695020&code=f97bp%2FyiCrfFF%2B4lIndT1k3PoVk5%2BmVvNJMYiBzq7ssWE8FS smj7T3jujWyDpKpT2t8vO7o5M19FlzvNdihXMDWqvyoko9C3lkpG%2BQX57zL112gb GH%2FPwS9YD9A3%2BQVKNFSDzriFOqq9IFWJx6q4x%2Fk%2FMAltJygTiwRZ" reload="1"></script> <script type="text/javascript" src="http://app3/api/uc.php?time=1324695020&code=2b55qIaEphMxdvEYZJok8GEoDW%2BctvZeWS84LvaH8MHf8AzrRXiLD ZFIvS4cmUkXAGGeDnSVQ9rsu62iDnSAUSTEdSH2%2Bup5xZFvtgl9KRMEcOLLySih2w vNL%2BSjRQgqErT5kEK0878zxlhRQn0ypgxXgmoCY3zE87sy" reload="1"></script>
注意的是, uc.php 需要 p3p header
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
2.app1, app2, app3, 用户请求 app1 登录, app1 程序在验证通过的时候让带着参数让浏览器跳到 app2.com (在输出页面的时候加上一段js, 代码类似下面), 然后再跳到 app3.com ... 依次种上 cookie 最后跳回 app1.com
<script type="text/javascript" reload="1">window.location.href=\'app1.com /loginAuth.phpcode=ctvZeWS84LvaH8MHf8AzrRXiLDZFIvS4cmUkXAGGeDnSVQ9rsu62iDnSAUSTEdSH2%2Bup5xZFvtgl9KRMEcOLLySih2wvNL%2BSjRQgqErT5kEK0878zxlhRQn0yp gxXgmoCY3zE87s'\';</script>
坏处是 - 在用户看起来, 页面会有好一会儿的白屏! 不适合多个应用.
3.Google 的方法, 坏处是用户得主动的点击登录按钮, 没法做到无缝的同步登录, 好处是适合多个应用;
哪一个好, 得看什么要求, 如果不需要做到无缝的同步登录的话, 肯定是使用 Google 的方案!
2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务