[总结]【原创】mybb通过UCenter和其他网站的整合,同步登陆、注册

SuperyyRan 发布于 2012/09/05 19:58
阅读 2K+
收藏 1
现在来总结一下利用UCenter将mybb和其他网站的整合问题,前提是你首先要让你自己的应用已经支持UCenter(本例中假设实现mybb和phpcms的整合)。
1.首先假设一下目录结构,以方便描述:
假设mybb放置在根目录htdocs中。即/mybb
2.下载UCenter1.6,下载地址: http://www.comsenz.com/downloads/install/ucenter
然后将其中的upload文件夹更名为uc_server,再将其拷贝到你的网站根目录/uc_server,然后在浏览器中输入 http://localhost/uc_server/install/按提示安装。安装完以后,登录到uc_server的界面,将自己的应用添加进去,包括phpcms和mybb,怎么添加请移步至 http://wenku.baidu.com/view/751d9253ad02de80d4d8405f.html
3.拷贝UCenter_1.6.0/advanced中的uc_client文件夹到/mybb中,然后拷贝UCenter_1.6.0/advanced/examples中的api、include文件夹以及文件config.inc.php到/mybb中。
4.更改config.inc.php中的配置信息,改为自己安装的uc_server的相关信息。比如:
define('UC_CONNECT', 'mysql');   // 连接 UCenter 的方式: mysql/NULL, 默认为空时为 fscoketopen()
 // mysql 是直接连接的数据库, 为了效率, 建议采用 mysql

//数据库相关 (mysql 连接时, 并且没有设置 UC_DBLINK 时, 需要配置以下变量)
define('UC_DBHOST', 'localhost');   // UCenter 数据库主机
define('UC_DBUSER', 'root');   // UCenter 数据库用户名
define('UC_DBPW', '123456');   // UCenter 数据库密码
define('UC_DBNAME', 'luntan');   // UCenter 数据库名称
define('UC_DBCHARSET', 'gbk');   // UCenter 数据库字符集
define('UC_DBTABLEPRE', 'uc_');   // UCenter 数据库表前缀

//通信相关
define('UC_KEY', 'cfdgfssdedf3454yujdr');   // 与 UCenter 的通信密钥, 要与 UCenter 保持一致
define('UC_API', 'http://localhost/uc_server');   // UCenter 的 URL 地址, 在调用头像时依赖此常量
define('UC_CHARSET', 'gbk');   // UCenter 的字符集
define('UC_IP', '');   // UCenter 的 IP, 当 UC_CONNECT 为非 mysql 方式时, 并且当前应用服务器解析域名有问题时, 请设置此值
define('UC_APPID', 3);   // 当前应用的 ID
配置好这些以后就可以登录到刚才的uc_server的应用管理那个地方看看通信是否成功,如果没成功,那么说明你的配置有问题,请参考ucenter提供的例子配置,网上也有,这个就不多说了,肯定能成功的。
5.下面来介绍怎么修改/mybb/api中的uc.php和/mybb中的member.php来实现同步登录和注册:
5.1 首先,在mybb的数据库表users中增加一个字段ucuserid,INT,长度10,unsigned。 增加该字段的作用是避免mybb和uc_server中的uid不一样的时候不能同步登录的现象。
5.2 同步登录:
在member.php的1047行"
my_setcookie("sid", $session->sid, -1, true);

"之后插入:
 //UC同步登录
 $uid = $user['uid'];

 $my_query = $db->simple_select("users", "ucuserid", "uid='{$uid}'");
 if($my_user = $db->fetch_array($my_query)) {
 $ucsynlogin = uc_user_synlogin($my_user['ucuserid']);
 echo $ucsynlogin;
 }
5.3 同步注册:
在member.php中的238行"else{"之后插入:
 if(uc_get_user($user['username'])) 
 {
 redirect("../index.php?m=member&c=index&a=login", $lang->redirect_alreadyregister);
 exit;
 }
 $my_uid = uc_user_register($user['username'], $user['password'], $user['email']);
 if($my_uid <= 0) {
 if($my_uid == -1) {
 redirect("member.php?action=login", $lang->redirect_login1);
 exit;
 } elseif($my_uid == -2) {
 redirect("member.php?action=login", $lang->redirect_login2);
 exit;
 } elseif($my_uid == -3) {
 redirect("member.php?action=login", $lang->redirect_login3);
 exit;
 } elseif($my_uid == -4) {
 redirect("member.php?action=login", $lang->redirect_login4);
 exit;
 } elseif($my_uid == -5) {
 redirect("member.php?action=login", $lang->redirect_login5);
 exit;
 } elseif($my_uid == -6) {
 redirect("member.php?action=login", $lang->redirect_login6);
 exit;
 } else {
 redirect("member.php?action=login", $lang->redirect_login7);
 exit;
 }
 }
接着在
$user_info = $userhandler->insert_user();

之后插入:
$db->update_query("users", array("ucuserid" => $my_uid), "username='".$user['username']."'");//更新新注册用户的ucuserid
5.4 对mybb中密码MD5的更改,由于mybb和ucenter总对密码生成的MD5用法不一样,在此将mybb中的更改成和uc_server中的一致:
   5.4.1 删掉member.php的933行
$logindetails = update_password($user['uid'], md5($password), $user['salt']);

中的md5;
   5.4.2 删掉mybb/inc/datahandlers中user.php文件中第199行的md5;
   5.4.3 删除mybb/inc中functions_user.php的第119行
if(salt_password(md5($password), $user['salt']) == $user['password'])

中的md5;
   5.4.4 更改mybb/inc中function_user.php中184行为:
return md5(md5($password).$salt);
5.5下面在mybb/中创建一个关于uc_server数据库参数的配置文件:config.uc.php,用来同步uc_server中的注册用户到mybb中
内容可以参考如下:
<?php

//ucexample_2.php 用到的应用程序数据库连接参数
$dbhost = 'localhost';   // 数据库服务器
$dbuser = 'root';   // 数据库用户名
$dbpw = '123456';   // 数据库密码
$dbname = 'luntan';   // 数据库名
$pconnect = 0;   // 数据库持久连接 0=关闭, 1=打开
$tablepre = 'uc_';     // 表名前缀, 同一数据库安装多个论坛请修改此处
$dbcharset = 'gbk';   // MySQL 字符集, 可选 'gbk', 'big5', 'utf8', 'latin1', 留空为按照论坛字符集设定

?>
5.6 下面最后一步,需该mybb/api/uc.php中的同步登陆和登出函数:
 function synlogin($get, $post) {
 $uid = $get['uid'];
 $username = $get['username'];
 if(!API_SYNLOGIN) {
 return API_RETURN_FORBIDDEN;
 }

 header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
 $uid = intval($uid);
 
 require_once DISCUZ_ROOT.'./config.uc.php'; 
 
 $ucdb = new dbstuff;
 $ucdb->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect, true, $dbcharset);
 unset($dbhost, $dbuser, $dbpw, $dbname, $pconnect);

 $s = $ucdb->query("SELECT * FROM ".$tablepre."members WHERE uid='$uid'");
 $r = $ucdb->fetch_array($s);

 $my_uid = $r['uid'];
 $my_usrname = $r['username'];
 $my_password = $r['password'];
 $my_email = $r['email'];
 $my_regip = $r['regip'];
 $my_salt = $r['salt'];

 
 $query = $this->db->query("SELECT uid, loginkey FROM ".$this->tablepre."users WHERE ucuserid='$uid' AND username='$username'");
 if($user = $this->db->fetch_array($query)) {
 _setcookie("mybbuser", $user['uid']."_".$user['loginkey']);
 }
 else{
 $this->db->query("INSERT INTO ".$this->tablepre."users (ucuserid, username, password, salt, loginkey, email, avatardimensions, usergroup, additionalgroups, usertitle, website, icq, aim, yahoo, msn, birthday, signature, threadmode, showsigs, showavatars, showquickreply, showredirect, dateformat, timeformat, timezone, buddylist, ignorelist, returndate, awayreason, pmfolders, notepad, regip, lastip, language, referrer, allownotices, hideemail, subscriptionmethod, receivepms, pmnotice, invisible, dstcorrection, usernotes, classicpostbit) VALUES ('$my_uid', '$my_usrname', '$my_password', '$my_salt', '', '$my_email', '', '5', '', '', '', '', '', '', '', '', '', 'linear', '1', '1', '1', '1', '', '', '8', '', '', '0', '', '', '', '$my_regip', '', '', '0', '1', '0', '0', '1', '1', '0', '2', '', '1')");

 $query2 = $this->db->query("SELECT uid, loginkey FROM ".$this->tablepre."users WHERE username='$username'");
 if($user2 = $this->db->fetch_array($query2)) {
 _setcookie("mybbuser", $user2['uid']."_".$user2['loginkey']);
 }
 }
 }

 function synlogout($get, $post) {
 if(!API_SYNLOGOUT) {
 return API_RETURN_FORBIDDEN;
 }

 //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('mybbuser', '', -86400 * 365);
 }


结束,如有问题请email至superyy.ran@gmail.com[hr]
另外,在后台将mybb的cookie path修改成: /
返回顶部
顶部