前段时间和一位群友一起探讨了discuz之ucenter同步登录问题,一下内容来自这位群友写的帖子,非常感谢他把我想做的事情做了,这里我就直接分享了希望对后面的同行带来一点小帮助,帖子提到的群友就是我哦
前言
首先感谢dozer学长吧UCenter翻译成C#
博客地址----------->http://www.dozer.cc/
其次感谢群友快乐々止境同学的热心指导,虽然萍水相逢但让我感受到了世界的温暖
文件配置
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0"/>
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>
</system.web>
<appSettings>
<!--客户端版本-->
<add key="UC_CLIENT_VERSION" value="1.5.2"/>
<!--发行时间-->
<add key="UC_CLIENT_RELEASE" value="20101001"/>
<!--API 开关(value类型:True False 默认值:True)-->
<!--是否允许删除用户-->
<add key="API_DELETEUSER" value="True"/>
<!--是否允许重命名用户-->
<add key="API_RENAMEUSER" value="True"/>
<!--是否允许得到标签-->
<add key="API_GETTAG" value="True"/>
<!--是否允许同步登录-->
<add key="API_SYNLOGIN" value="True"/>
<!--是否允许同步登出-->
<add key="API_SYNLOGOUT" value="True"/>
<!--是否允许更改密码-->
<add key="API_UPDATEPW" value="True"/>
<!--是否允许更新关键字-->
<add key="API_UPDATEBADWORDS" value="True"/>
<!--是否允许更新域名解析缓存-->
<add key="API_UPDATEHOSTS" value="True"/>
<!--是否允许更新应用列表-->
<add key="API_UPDATEAPPS" value="True"/>
<!--是否允许更新客户端缓存-->
<add key="API_UPDATECLIENT" value="True"/>
<!--是否允许更新用户积分-->
<add key="API_UPDATECREDIT" value="True"/>
<!--是否允许向UCenter提供积分设置-->
<add key="API_GETCREDITSETTINGS" value="True"/>
<!--是否允许获取用户的某项积分-->
<add key="API_GETCREDIT" value="True"/>
<!--是否允许更新应用积分设置-->
<add key="API_UPDATECREDITSETTINGS" value="True"/>
<!--API 开关结束-->
<!--返回值设置-->
<!--返回成功(默认:1)-->
<add key="API_RETURN_SUCCEED" value="1"/>
<!--返回失败(默认:-1)-->
<add key="API_RETURN_FAILED" value="-1"/>
<!--返回禁用(默认:-2)-->
<add key="API_RETURN_FORBIDDEN" value="-2"/>
<!--返回值设置结束-->
<!--[必填]通信密钥-->
<add key="UC_KEY" value="FD144298AF7E4797A66ACC0C18C97EA3"/>
<!--[必填]UCenter地址-->
<add key="UC_API" value="http://localhost:8080/uc_server"/>
<!--[必填]默认编码-->
<add key="UC_CHARSET" value="gbk"/>
<!--[非必填]UCenter IP-->
<add key="UC_IP" value=""/>
<!--[必填]应用ID-->
<add key="UC_APPID" value="2"/>
</appSettings>
</configuration>
这样以后,我的网站就能更UCenter交流
但是具体怎么交流?
这里我就创建一个ashx做示范
Talk is cheap.Show you the code
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html";
IUcClient client = new UcClient();
var user = client.UserLogin("us1", "111111");//登陆
var js=client.UserSynlogin(user.Uid);//返回一个js代码,这是同步登入的关键
if (user.Result==LoginResult.Success)
{
context.Response.Write(js);
context.Response.Write(user.UserName);
}
}
这是一段通知UCenter,us1用户登入,同时通知被UCenter管理的其他应用登入的代码
上面可以认为是我的网站去找UCenter,但是UCenter怎么找我,所谓通信必须是你来我往
添加一个API文件夹,在下面添加一个uc.ashx(是不是很眼熟,没错刚刚在UCenter应用管理中心就是设置了这个)
让uc继承UcApiBase,实现其抽象方法
删除 uc.ashx的ProcessRequest 方法 因为UcApiBase里面有了
好启动你的网站
- 确保你的iis启动着
- wampserver正常运行,要绿绿的(MySQL启动着,本来是一篇文章被我拆成两篇,所以这里有点突兀)
- 确保你的Discuz能访问
- 确保UCenter中的配置与Web.Config正确
- 确保你的新网站在服务器运行
启动后你会发现UCenter应用中心,原本的通信失败变成成功
访问TestHandler.ashx
如果成功页面会显示这个用户的用户名
跳转到Discuz,你会发现你的用户已登入
接下来解释下这过程
这个图能解释TestHandler.ashx的ProcessRequest
返回的js将再浏览器中执行
它会请求discuz网站下的UCenterApi,它会告诉Discuz是谁登入了
这段js也解释了为什么uc.ashx必须放在一个api文件夹下
这样同步登入就大致说完了
下面说说
discuz同步登入你的网站
到你的discuz网站下的uc_client\data\cache
找到apps.php
<?php
$_CACHE['apps'] = array (
1 =>
array (
'appid' => '1',
'type' => 'DISCUZX',
'name' => 'Discuz! Board',
'url' => 'http://localhost:8080',
'ip' => '',
'viewprourl' => '',
'apifilename' => 'uc.php',
'charset' => '',
'dbcharset' => '',
'synlogin' => '1',
'recvnote' => '1',
'extra' => false,
'tagtemplates' => '',
'allowips' => '',
),
);
?>
造它的样子抄一份,注意适当得修改
<?php
$_CACHE['apps'] = array (
1 =>
array (
'appid' => '1',
'type' => 'DISCUZX',
'name' => 'Discuz! Board',
'url' => 'http://localhost:8080',
'ip' => '',
'viewprourl' => '',
'apifilename' => 'uc.php',
'charset' => '',
'dbcharset' => '',
'synlogin' => '1',
'recvnote' => '1',
'extra' => false,
'tagtemplates' => '',
'allowips' => '',
),
2 =>
array (
'appid' => '2',
'type' => 'OTHER',
'name' => 'MyWebSite',
'url' => 'http://localhost:7067',
'ip' => '',
'viewprourl' => '',
'apifilename' => 'uc.ashx',
'charset' => '',
'dbcharset' => '',
'synlogin' => '1',
'recvnote' => '1',
'extra' => false,
'tagtemplates' => '',
'allowips' => '',
),
);
?>
问我为什么要做这个,其实我也不知道,反正如果不这样改的话,你在discuz登入时候,不会像上面一样返回一段js给你,更别说同步登入
这样就能同步登入了
当在discuz登入的时候,将触发你的网站的uc.asxh的
public
override
ApiReturn SynLogin(
int
uid)方法
你可以在这里写你的操作
比如