基于UCenter用户中心把第三方网站的会员与Discuz关联起来(续2)
[文章作者:磨延城 转载请注明原文出处: https://mo2g.com/view/151/ ]
国庆找了些时间把后边的内容补上,这一篇主要跟大家讲一下UCenter用户中心的工作原理,然后再简单的分析一下同步登录、同步注销的功能,这样或许会对UCenter有更加清晰的认识.之后大家就可以根据官方的文档定制开发自己需要的功能了.
国庆找了些时间把后边的内容补上,这一篇主要跟大家讲一下UCenter用户中心的工作原理,然后再简单的分析一下同步登录、同步注销的功能,这样或许会对UCenter有更加清晰的认识。之后大家就可以根据官方的文档定制开发自己需要的功能了。
上一篇《基于UCenter用户中心把第三方网站的会员与Discuz关联起来(续1)》,我们的测试代码已经跟UCenter正常通讯了,接下来,就跟大家简述一下,同步登录的流程。假设我们拥有以下几个网站:
A)主营网站
B)Discuz论坛
C)UCenter
1)用户在A登录后,A会向C发送一个登录消息,C收到消息后会把消息转发到与UCenter正常通讯且配置正确的应用。这个例子中,B提供的API会收到登录通知,然后处理登录请求。
2)用户在B登录后,B会向C发送一个登录消息,C收到消息后会把消息转发到与UCenter正常通讯且配置正确的应用。这个例子中,A提供的API会收到登录通知,然后处理登录请求。
根据我们上回的配置,网站的API就是:http://192.168.1.9/uc_test/api/uc.php
接下来,我们就以uc.php这个PHP文件为示例,来说明同步登录与同步注销的功能实现。
if(in_array($get['action'], array('test', 'deleteuser', 'renameuser', 'gettag', 'synlogin', 'synlogout', 'updatepw', 'updatebadwords', 'updatehosts', 'updateapps', 'updateclient', 'updatecredit', 'getcreditsettings', 'updatecreditsettings'))) { require_once DISCUZ_ROOT.'./include/db_mysql.class.php'; $GLOBALS['db'] = new dbstuff; $GLOBALS['db']->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect, true, $dbcharset); $GLOBALS['tablepre'] = $tablepre; unset($dbhost, $dbuser, $dbpw, $dbname, $pconnect); $uc_note = new uc_note(); exit($uc_note->$get['action']($get, $post)); } else { exit(API_RETURN_FAILED); }
这段代码先是连接了mysql数据库,并且实例化了一个类,然后根据获取到的action变量调用类中的方法。
例如UCenter中的通信成功,就是因为成功调用uc_note类中的方法test()。
为了验证这一说法,我们在uc.php里添加如下代码,来记录信息,以便之后的调试。
function mlog($log = '',$file = '') { if( $file == '' ) $file = 'log.txt'; $log = print_r($log,true); $log = "date:" . date("Y-m-d H:i:s") . "\n{$log}\n"; file_put_contents($file,$log,FILE_APPEND|LOCK_EX); }
再修改uc_note的方法test()
function test($get, $post) { mlog(1); return API_RETURN_SUCCEED; }
只要通讯成功,api目录下就多出一个log.txt文件,请确保PHP有权限对目录进行操作。
或许你应该猜到了,方法synlogin、synlogout分别对应了同步登录、同步注销。是的,确实是这样。
在synlogin方法中,我们不需要再去验证用户uid、密码什么的,因为用户确实已经验证通过了UCenter才会发送通知请求的。所以我只需要在synlogin添加用户的SESSION信息。如果需要特殊的操作,比如根据UID查询用户状态、是否为会员等信息,可以参考如下代码:
function synlogin($get, $post) { $uid = $get['uid']; $username = $get['username']; if(!API_SYNLOGIN) { return API_RETURN_FORBIDDEN; } $config = include '数据库配置文件'; $db = new dbstuff; $db->connect($config['DB_HOST'], $config['DB_USER'], $config['DB_PWD'], $config['DB_NAME'], $config['CONTENT_COMMENT_OPEN'], true); unset($config); $strSql = "select status,vip from user where uid = $uid "; $arrData = $db->fetch_first($strSql); if( !isset( $_SESSION ) ) session_start(); $_SESSION['user'] = array( 'uid' => $uid, 'username' => $username, 'status' => $arrData['status'], 'vip' => $arrData['vip'] ); header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'); _setcookie('auth', _authcode($uid."\t".$username, 'ENCODE')); }
同步注销就更容易了,如果在测试的过程有什么问题,可以用mlog函数来进行调试。
function synlogout($get, $post) { if(!API_SYNLOGOUT) { return API_RETURN_FORBIDDEN; } if( !isset( $_SESSION ) ) session_start(); session_destroy(); //note 同步登出 API 接口 header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'); _setcookie('auth', '', -86400 * 365); }
上边的同步代码是收到登录、注销通知的相关操作,还差发送登录、注销通知的操作。
其实也很简单,直接看这一段登录通知的代码:
include './uc_client/client.php'; $ucsynlogin = uc_user_synlogin($uid); echo $ucsynlogin;
$ucsynlogin其实是一段js代码,作用也是调用对应的api接口,达到传递信息的作用。
注销通知:
include './uc_client/client.php'; $ucsynlogout = uc_user_synlogout(); echo $ucsynlogout;
至此,UCenter用户中心的功能就介绍的差不多了,其他的功能,都可以从官方的文档上找到,相信通过这些简单的示例,上手应该就容易些了。
我来说两句: