<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/UCenter-and-sso/</link>
<title><![CDATA[UCenter的应用整合及其单点登录分析]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[Web开发]]></category>
<pubDate>Sun, 11 Aug 2013 14:41:58 +0000</pubDate> 
<guid>https://www.heckjj.com/UCenter-and-sso/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;很多年一直在用腾讯康盛的产品，自然少不了单点登陆，最近重新研究了下ucenter的机制，其实它的基本原理就一句话：跨域设置用户信息。下面只对用户登陆做比较详细说明，其他注册、PM等操作其实原理差不多。<br/><br/><strong>用户登陆</strong><br/><textarea name="code" class="php" rows="15" cols="100">
do_login.php[uchome]

$passport = getpassport($username, $password);
</textarea><br/><br/>此处操作调用了uc_client下client.php的 uc_user_login($username, $password);<br/><br/>此函数又调用了call_user_func(UC_API_FUNC, &#039;user&#039;, &#039;login&#039;, array())<br/><br/>call_user_func回调UC_API_FUNC， 此处为uc_api_mysql函数，即调用 uc_api_mysql函数，后面的&#039;user&#039;, &#039;login&#039;, array()是参数。而uc_api_mysql的实质是调用uc_client的controller下的user控制器，然后执行onlogin方法。<br/><br/>该方法则是判断用户提交信息是否正确，然后返回对应uc_member表的uid。<br/><br/>总结：<br/><br/>uchome的用户登陆主要通过uc_client进行操作，判断用户信息是否正确，最终返回对应于uc表的uid, 供单点登陆用。<br/>整合自己应用的时候可以不必这么复杂，登陆完全可以走自己的模式，只是要返回下uc表的uid,供单点登陆用即可。 <br/><br/><strong>单点登陆</strong><br/><br/><textarea name="code" class="php" rows="15" cols="100">
include &#039;uc_client/client.php&#039;;

uc_user_synlogin($uid);
</textarea><br/><br/>uc_user_synlogin内部则调用uc_api_post(&#039;user&#039;, &#039;synlogin&#039;, array(&#039;uid&#039;=&gt;$uid));<br/><br/>uc_api_post函数的作用是将将数据通过socket发送到ucenter。<br/><br/>uc_api_post同时调用uc_api_requestdata和uc_fopen2函数。<br/><br/>uc_api_requestdata构造发送给用户中心的请求数据。<br/><br/>uc_fopen2远程打开URL，本质是调用uc_fopen函数，通过 fsockopen远程打开ucenter/index.php，并且传递参数，调用user控制器执行onsynlogin() 方法，onsynlogin()读取缓存，缓存文件保留有各单点登陆应用的基本信息 [比如bbs supersite的基本信息]。然后循环通过JS调用不同应用下api下的uc.php。<br/><br/><textarea name="code" class="php" rows="15" cols="100">
下一步转移到各应用下的uc.php调用synlogin($get, $post)

header(&#039;P3P: CP=&quot;CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR&quot;&#039;);

setcookie();
</textarea><br/><br/>从而实现跨域设置cookie<br/><br/>P3p作用：<br/><br/>比如有2个应用，a.nowamagic.net 和 b.nowamagic.net 另外有个公用的uceter.nowamagic.net，uceter.nowamagic.net通过JS跨域调用a.nowamagic.net b.nowamagic.net，这两个脚本都做了设置cookie 的功能，但为了跨域，考虑到不同浏览器[主要考虑IE6]，必须调用P3P，实现成功跨域。<br/><br/>总结：总的来说，UCENTER一站登陆原理是socket远程打开ucenter，并且传输已经登陆的公用UID，ucnter循环通过JS调用各应用下的api，在各个地方设置cookie，而保证cookie通用的则是P3P处理[注意不同应用下的api脚本不一样，bbs的uc.php不同于uchome的uc.php]。<br/><br/><strong>整合自己的应用</strong><br/><br/>下载UCENTER，并且打好UCENTER的数据表，uc_members表的作用是存储通用的ID数据。<br/>在自己的应用下增加uc_client 和 api，这两个目录下的文件需要根据实际情况进行更改。<br/>进入ucenter的后台，添加单点登陆的应用。<br/>添加单点登陆成功后会出现一些配置信息，在自己的应用下添加config.php, 并且复制配置信息，增加一句 $database = &#039;mysql&#039;;<br/>新版本的UC范例，通信不成功是因为范例目录下的那个config.inc.php少了这句 $database = &#039;mysql&#039;;<br/>导致连不上 include/下的数据库类文件。<br/><br/>至此，基本操作已经完成，另外具体情况则按照自己的应用进行不同的操作。<br/><br/><strong>应用整合其他办法</strong><br/><br/>其实也可以不走单点登陆，全站统一个注册、登陆接口即可，注意各个应用cookie的前缀要一样，考虑跨域的话可以用jquery的jsonp，此时的注册、登陆得自己写一套，注册、登陆的模式跟原本应用一样就可以啦，比如cookie的加密方式、cookie的作用域以及cookie存储的数据格式。<br/>Tags - <a href="https://www.heckjj.com/tags/ucenter/" rel="tag">ucenter</a> , <a href="https://www.heckjj.com/tags/%25E5%258D%2595%25E7%2582%25B9%25E7%2599%25BB%25E5%25BD%2595/" rel="tag">单点登录</a> , <a href="https://www.heckjj.com/tags/ucenter%25E6%2595%25B4%25E5%2590%2588/" rel="tag">ucenter整合</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/UCenter-and-sso/#blogcomment</link>
<title><![CDATA[[评论] UCenter的应用整合及其单点登录分析]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/UCenter-and-sso/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>