Discuz x3 UCenter实现同步登陆原理
1、Discuz x3 的登录页面URL是:/member.php?mod=logging&action=login
2、这个登录页面,登录提交的地址是:
<form method="post" autocomplete="off" name="login" id="loginform_LKsWY" class="cl" onsubmit="pwdclear = 1;ajaxpost('loginform_LKsWY', 'returnmessage_LKsWY', 'returnmessage_LKsWY', 'onerror');return false;" action="member.php?mod=logging&action=login&loginsubmit=yes&handlekey=login&loginhash=LKsWY" fwin="login">
在 /member.php 文件中,我们可以看到对应的加载的mod文件:
require DISCUZ_ROOT.'./source/module/member/member_'.$mod.'.php';
在/source/module/member/member_logging 文件中,我们看到下面代码:
$ctl_obj = new logging_ctl();
$ctl_obj->setting = $_G['setting'];
$method = 'on_'.$_GET['action'];
$ctl_obj->template = 'member/login';
$ctl_obj->$method();
这里的类 logging_ctl 来自 source/class/class_member.php 文件。
这个类的 function on_login() 方法就是登录处理的方法。
其中 on_login() 方法中下面这一行就是判断DB中数据是否能匹配。也就是对username和password进行验证。
$result = userlogin($_GET['username'], $_GET['password'], $_GET['questionid'], $_GET['answer'], $this->setting['autoidselect'] ? 'auto' : $_GET['loginfield'], $_G['clientip']);
这个函数的实现在 source/function/function_member.php 这个文件中。
3、如果验证成功,将调用位于uc_client下client.php文件中的函数uc_user_synlogin,
class_member.php中调用代码:
$ucsynlogin = $this->setting['allowsynlogin'] ? uc_user_synlogin($_G['uid']) : '';
uc_client下client.php文件中,uc_user_synlogin($uid) 函数
调用 $return = uc_api_post('user', 'synlogin', array('uid'=>$uid));
参考:http://bbs.phpchina.com/thread-112304-1-1.html
uc_api_post函数的作用是将将数据通过socket发送到ucenter。
对应的代码在 client.php 文件中,代码如下:
function uc_api_post($module, $action, $arg = array()) {
$s = $sep = '';
foreach($arg as $k => $v) {
$k = urlencode($k);
if(is_array($v)) {
$s2 = $sep2 = '';
foreach($v as $k2 => $v2) {
$k2 = urlencode($k2);
$s2 .= "$sep2{$k}[$k2]=".urlencode(uc_stripslashes($v2));
$sep2 = '&';
}
$s .= $sep.$s2;
} else {
$s .= "$sep$k=".urlencode(uc_stripslashes($v));
}
$sep = '&';
}
$postdata = uc_api_requestdata($module, $action, $s);
return uc_fopen2(UC_API.'/index.php', 500000, $postdata, '', TRUE, UC_IP, 20);
}
注意是向:UC_API.'/index.php' 这个地址, 一般是 /uc_server/index.php 这个文件。
4、然后这个函数后向Ucenter的index.php传递数据,index.php接受传递的数据,获得model为user,action为synlogin的值。
5、然后Ucenter的index.php调用/uc_server/control目录下的user.php类中的onsynlogin方法,
/uc_server/index.php 代码中如下代码:
define('UC_ROOT', dirname(__FILE__).'/');
include UC_ROOT."control/$m.php";
$method = 'on'.$a;
通过foreach循环,以javascript的方式通知uc应用列表中开启同步登陆的应用进行同步登录;即通过get方式传递给各个应用目录中api下的uc.php一些数据。
6、uc.php接收通知并处理get过来的数据,并在函数synlogin(位于uc.php中)通过函数_authcode加密数据(默认以UC_KEY作为密钥),用函数_setcookie设置cookie。
7、各个应用用对应的密钥解码上面设置的cookie,得到用户id等数据;通过这个值来判断用户是否经过其它应用登录过,从而让用户可以自动登陆。
应用程序的logging.php ------>uc_client中的client.php------>Ucenter------>应用程序中api/uc.php
其实Ucenter实现同步登陆的原理就是cookie,一个应用登陆成功之后,向Ucenter传递数据,让Ucenter通知其他的应用也设置cookie,这样用户在访问其他应用的时候通过已经设置好的cookie实现自动登陆。了解了Ucenter的同步原理,再遇到无法同步登陆,或者开发一些与UCenter接口的时候就会容易很多。
参考资料:
ucenter单点登陆总结
http://xuebingnanmm.iteye.com/blog/681695
个人对UCenter通信原理的总结
http://bbs.phpchina.com/thread-112304-1-1.html
无需激活直接同步登入discuz,php代码(直接可用)
http://www.discuz.net/thread-3495435-1-1.html
UCenter实现同步登陆原理
http://xuqin.blog.51cto.com/5183168/1293551
[已解决] 修改文件实现Discuz新注册帐号同步其他应用
http://www.discuz.net/forum.php?mod=viewthread&tid=3522745
Discuz x3 UCenter实现同步登陆原理的更多相关文章
- phpcms v9和discuz X3.1实现同步登陆退出论坛(已实现)
网络上文章很多,按步骤配置好了之后phpcms可以同步登录dz,但是dz登录后状态却无法同步到phpcms,网络上找了很多资料都大同小异,头大.只能自己调试了,废话不多说了. 以下网络上抄 ...
- phpcms 2008和discuz X3.1实现同步登陆退出论坛(已实现)
网络上文章很多,按步骤配置好了之后phpcms可以同步登录dz,但是dz登录后状态却无法同步到phpcms,网络上找了很多资料都大同小异,头大.只能自己调试了,废话不多说了. 以下网络上抄 ...
- UCenter uc_user_synlogin同步登陆返回值为空(NULL)的解决办法 及 ucenter原理
第一种方法最近刚刚接触UCenter,很多问题不是很理解,只是在摸索着.尝试着做,就在刚才有解决了一个问题,虽然不知道解决问题的具体原理,但是还是实现了同步登陆.首先我是在本地测试的,也就是local ...
- ucenter 整合同步登录的内部实现原理及thinkphp整合ucenter
1.用户登录discuz,通过logging.php文件中的函数uc_user_login对post过来的数据进行验证,也就是对username和password进行验证.2.如果验证成功,将调用位于 ...
- ucenter 整合同步登录的内部实现原理
1.用户登录discuz,通过logging.php文件中的函数uc_user_login对post过来的数据进行验证,也就是对username和password进行验证. 2.如果验证成功,将调用位 ...
- 简单分析ucenter 会员同步登录通信原理
1.用户登录discuz,通过logging.php文件中的函数uc_user_login对post过来的数据进行验证,也就是对username和password进行验证. 2.如果验证成功,将调用位 ...
- netMVC 搭建Ucenter 同步登陆退出discuz
先看一下效果
- Discuz! X3搬家后UCenter出现UCenter info: MySQL Query Error解决方案
Discuz! X3 X2.5论坛搬家后 登录UCenter出现报错:UCenter info: MySQL Query ErrorSQL:SELECT value FROM [Table]vars ...
- dedecmsV5.7和discuz!X3.4整合之后免激活登陆
问题:dedecmsv5.7和discuz!X3.4整合之后,从dede过去的用户,第一次登陆discuz!X3.4,需要激活.后来我就上百度了一番,找到了一个方法 我找到的方法: 1.在dedecm ...
随机推荐
- 小记一次shellscript的麻烦
小记一次shellscript的麻烦 一.起因: 之前写过篇文章 文本分析实例 ,大致的内容就是对 "nginx的web服务器进行日志分析,删除不被访问的截图". 点我打开哔哩哔哩 ...
- java处理excel-xlsx格式大文件的解决方案
1.第一次读取7M左右的ecxel文件,使用poi 库实现,参考了下面的博文. http://www.cnblogs.com/chenfool/p/3632642.html 使用上面的方法在 下面Wo ...
- jquery全屏幻灯轮播焦点图
<!--banner s--> <div class="banner"> <div class="hd"> <ul&g ...
- 扩大VirtualBox虚拟机磁盘的方法
之前在VirtualBox里安装了一个XP系统,当时只分配了10G磁盘空间,随着使用,空间不足了. 在虚拟机管理器里不能直接调整磁盘的大小,这里要用到VirtualBox安装目录下的VBoxManag ...
- Linux进程间通信——使用System V 消息队列
消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问 ...
- Web项目通过Maven部署到Tomcat的错误。
一直提示: Maven Build的时候,一直提示一个关键错误 Cannot invoke Tomcat manager: Error writing to server 找了网上提示说应该先启动To ...
- JavaWeb学习笔记(二十)—— Ajax
一.Ajax概述 1.1 什么是Ajax AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与 ...
- oracle nvl()函数
oracle的nvl()函数作用是当第一个值不为null时,返回第一个值,否则返回第二个值. 当第一个值为一个运算表达式时,那么第二个的值被限定为只能是NUMBER类型或者能隐式转换为NUMBER类型 ...
- Go语言特殊函数介绍
main 函数 Go语言程序的默认入口函数(主函数):func main()函数体用{}一对括号包裹.只能应用于package main func main(){ //函数体 } init 函数 go ...
- 博客主题皮肤探索-GitHub和jsdelivr的使用
有个前言 本萌并不会前端相关的知识,一切都是自己慢慢摸索出来的,如果存在代码方面的不足,请尽快告诉我~~~ 使用一个主题 目前我博客使用是 https://www.cnblogs.com/bndong ...