用户中心和discuz的ucenter共通

原创
2020/11/19 20:34
阅读数 119

[文章作者:磨延城 转载请注明原文出处: https://mo2g.com/view/106/ ]

然而问题就来了,怎么把现有网站的用户跟discuz关联到一起呢?后来一同事跟我提到Comsenz旗下UCenter(用户中心),跟我说它能无缝整合多个网站的会员,很容易就能解决这一问题,然后把UCenter的开发文档链接发给我.于是我这几天就带着问题开始学习UCenter究竟是怎么样实现的无缝管理用户的.

公司的业务发展跟原计划中的一样顺利,伴随着VIP会员的与日俱增,原网站的用户体验越显得苍白没劲,当务之急就是要想办法完善用户体验,加强用户粘度,让用户在网站中形成一个有形无形的关系链,才能更好的留住用户。在用户空间、互动社区这一块,discuz是当前最好的选择。

然而问题就来了,怎么把网站现有的用户跟discuz整合到一起呢?后来一同事跟我提到Comsenz旗下UCenter(用户中心),跟我说它能无缝整合多个网站的会员,很容易就能解决这一问题,然后把UCenter的开发文档链接发给我。于是我这几天就带着问题开始学习UCenter究竟是怎么样实现的无缝管理用户的。

也许是同事过分的神话,又或者是我没接触过discuz的原因,一开始我真的相信UCenter可以自动化的实现无缝管理第三方用户数据,直到碰了壁,我才踏踏实实的过一了遍源代码,长了记性:还是亲妈比较亲。类似我现在维护的网站,对于UCenter来说,属于第三方网站,要想融入进来,还是得做一些代码调整。

下边我讲一讲UCenter的运作原理,至于具体的二次开发,还得根据自己的需求来进行。其实只要掌握了UCenter运作流程,就可以大显身手了。这就看看下边的场景:

1)原有网站A,已有大量用户

2)基于Discuz,新增用户空间、互动社区

3)用户管理中心UCenter

我们需要实现如下功能:

1)网站A的老用户可以无缝融入并使用Discuz的功能

2)在Discuz注册的新用户也可以无缝融入并使用网站A,并且保证用户是唯一的

3)用户可以在网站A与Discuz之间实现同步登录跟注销

UCenter用户中心为了完成统一管理,大致按照下边的处理办法实现

1)把已有的会员相关数据导入UCenter的用户数据表

2)新用户注册都得经过UCenter的审核,网站的注册程序再根据审核结果进行处理,以保证用户名或邮箱的唯一性

3)用户的登录跟注销操作都汇报给UCenter,UCenter用户中心再通知所有的网站程序做进一步处理

上述最关键的第一步,就是把用户导入UC中心,没有这些数据,即使UC后台显示通信成功,也是白搭。

默认的数据表为uc_member,需要的插入的字段为uid、username、password、email、regip、regdate、salt,下边简单讲一下password字段。

password字段的值存储的是密码,加密方式为md5(md5(原始密码)+6位随机字符),如下

1
2
$salt  '123456' ; //随机的6位字符
$password  = md5( md5( '123456' ) .  $salt  );

接下来直入正题,先是用一个简单示例,以图文形式快速的讲解如何接入UCenter。

1)下载UCenter_1.6.0_SC_UTF8.zip,解压得到


 

解压uc.png

2)把upload文件夹复制出来,放到网站的根目录,并更名为ucenter(图中我用了UCenter,其实可以自己定义,下边还是以小写来讲解)


比如:

Linux系统:/web/ucenter/

windows系统:d:/web/ucenter/

uc文件结构.png

3)通过浏览器访问


 

我这里的测试环境IP为192.168.1.9,所以访问地址为 http://192.168.1.9/ucenter

题外话:也可以通过nginx或者apache重写一个网址对应到ucenter。

nginx配置参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
     listen       80; 
     server_name  www.uc.com;
     set  $root  /web/ucenter ;
     root $root;
 
     location / { 
         index index.php  index.html index.htm;
         if  (!-f $request_filename) {
             rewrite ^/(.*)$  /index .php?q=$1 last;
         }   
     }   
     include  /etc/nginx/conf .d /php .conf;
}

然后通过www.uc.com这个域名来访问ucenter用户中心。

Linux系统修改:/etc/hosts

windows系统修改:C:\Windows\System32\drivers\etc\hosts

添加映射关系,以后www.uc.com就跟192.168.1.9关联起来了。(类似屏蔽优酷广告的方法,也是通过修改hosts来实现的)

1
192.168.1.9 www.uc.com

4)安装ucenter流程就不介绍了,根据提示安装即可

5)添加应用


 

打开应用管理->添加应用

uc应用管理.jpg

接下来填写相关配置,这里我们选择自定义安装,类型为其他,再填写应用名称、URL即可

配置uc.png

保存后,ucentor会生成一段配置代码,复制下来

获取配置代码.png

6)通过简单的demo来与ucenter进行通信


 

从步骤1)中解压的advanced目录中,把uc_client还有examples目录中的api、include文件夹一起复制到/web/uc_test文件夹下,得到如下图的目录结构

uc_test1.png

在uc_test目录下新建一个php配置文件config.inc.php,内容就是步骤5)ucentor生成的那段配置代码

7)检查通信情况


 

再次打开应用管理,就能够检测之前的配置是否正确了。

验证_副本.jpg

 

我们的测试代码已经跟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文件为示例,来说明同步登录与同步注销的功能实现。

1
2
3
4
5
6
7
8
9
10
11
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里添加如下代码,来记录信息,以便之后的调试。

1
2
3
4
5
6
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()

1
2
3
4
function  test( $get $post ) {
     mlog(1);
     return  API_RETURN_SUCCEED;
}

只要通讯成功,api目录下就多出一个log.txt文件,请确保PHP有权限对目录进行操作。

或许你应该猜到了,方法synlogin、synlogout分别对应了同步登录、同步注销。是的,确实是这样。

在synlogin方法中,我们不需要再去验证用户uid、密码什么的,因为用户确实已经验证通过了UCenter才会发送通知请求的。所以我只需要在synlogin添加用户的SESSION信息。如果需要特殊的操作,比如根据UID查询用户状态、是否为会员等信息,可以参考如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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函数来进行调试。

1
2
3
4
5
6
7
8
9
10
11
12
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);
}

上边的同步代码是收到登录、注销通知的相关操作,还差发送登录、注销通知的操作。

其实也很简单,直接看这一段登录通知的代码:

1
2
3
include  './uc_client/client.php' ;
$ucsynlogin  = uc_user_synlogin( $uid );
echo  $ucsynlogin ;

$ucsynlogin其实是一段js代码,作用也是调用对应的api接口,达到传递信息的作用。

注销通知:

1
2
3
include  './uc_client/client.php' ;
$ucsynlogout  = uc_user_synlogout();
echo  $ucsynlogout ;

至此,UCenter用户中心的功能就介绍的差不多了,其他的功能,都可以从官方的文档上找到,相信通过这些简单的示例,上手应该就容易些了。

展开阅读全文
php
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部