程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> 單點登錄 Ucenter 原理分析

單點登錄 Ucenter 原理分析

編輯:PHP綜合

單點登錄 Ucenter 原理分析

首先我們先來了解下 Ucenter登錄步驟


1、用戶登錄discuz,通過logging.php文件中的函數uc_user_login對post過來的數據進行驗證,也就是對username和password進行驗證。


2、如果驗證成功,將調用位於uc_client下client.php文件中的函數uc_user_synlogin,在這個函數中調用 uc_api_post('user', 'synlogin', array('uid'=>$uid))。


3、然後這個函數後向Ucenter的index.php傳遞數據,index.php接受傳遞的數據,獲得model為user,action為synlogin的值。


4、然後Ucenter的index.php調用control目錄下的user.php類中的onsynlogin方法,通過foreach循環,以 javascript的方式通知uc應用列表中開啟同步登陸的應用進行同步登錄;即通過get方式傳遞給各個應用目錄中api下的uc.php一些數據。


5、uc.php接收通知並處理get過來的數據,並在函數synlogin(位於uc.php中)通過函數_authcode加密數據(默認以UC_KEY作為密鑰),用函數_setcookie設置cookie。


6、各個應用用對應的密鑰解碼上面設置的cookie,得到用戶id等數據;通過這個值來判斷用戶是否經過其它應用登錄過,從而讓用戶可以自動登陸。


應用程序的logging.php ------>uc_client中的client.php------>Ucenter------>應用程序中api/uc.php


      其實Ucenter實現同步登陸的原理就是cookie,一個應用登陸成功之後,向Ucenter傳遞數據,讓Ucenter通知其他的應用也設置 cookie,這樣用戶在訪問其他應用的時候通過已經設置好的cookie實現自動登陸。了解了Ucenter的同步原理,再遇到無法同步登陸,或者開發 一些與UCenter接口的時候就會容易很多。

 

大致步驟  首先我們要先安裝 ucenter 然後把uc_client 這個文件夾復制到自己的項目裡面去 然後呢在配置幾個文件 

client.php相當於函數庫

uc.php相當於回調文件

還有一個 config.inc.php 是配置文件 

 

當你有2個應用都設置了同步登陸之後  當你登陸一個應用 然後執行

 

 include './config.inc.php';
   include './uc_client/client.php';
   $usernames="feiye";
   $passwords="789123";
   list($uid, $username, $password, $email) = uc_user_login($usernames, $passwords);
	if($uid > 0) {
	    setcookie("username",$username,time()+intval(24*3600));
		echo uc_user_synlogin($uid);
		echo '登錄成功';
	} elseif($uid == -1) {
		echo '用戶不存在,或者被刪除';
	} elseif($uid == -2) {
		echo '密碼錯';
	} else {
		echo '未定義';
	}

uc_user_synlogin() 這個函數 代表著 要同步登陸到其他所有開啟同步登陸的函數  uc自己會在後台把所有開啟同步登陸的應用都給循環遍歷一遍 然後 在頁面上輸出 

<script type="text/javascript" src="http://127.0.0.70/api/uc.php?time=1374540644&;code=14fdIufn%2B2YwkQlN9P07FEHOfZvDJupvgBgaRPn7R0DJmbEwCb23vKwO1uaeybLq3HZhtokoZrnqu7NGi09jzs684drFCbLDiSpKhk6P50MftBRA3vp4yIswhrPMl1dXo5ajB7CVZ9F8EI%2BkdFfq0E0rdyeRkuz8goeHhg" reload="1"></script>

<script type="text/javascript" src="http://127.0.0.71/api/uc.php?time=1374540644&;code=07a91g8SepQwwfA3C1uN1sPhC4v6yuER1jFbVTQMK%2BQZmTkjwOz8X%2B8rWgNmKdhlXe9XXVQqAkDjN26CK6BMA19ZpLoiSW4wuNnxHAB9xXLt2VExuyf03MnEHAC%2BUdjwb58sbXGcYUpM4Bmzdm3Q92ObSp0Kk2qCd12fqg" reload="1"></script>

類似這種的js代碼 就是發送給每個開啟同步登陸的應用 然後 每個開啟同步登陸的應用  的 回調文件 uc.php 接受到後 會進行解密 解密好後 其實 你就可以自己來寫代碼了  這個uc.php回調文件的代碼不一定非要按照他們的格式來寫 你也可以自己寫你自己的代碼  比如說我就是根據session來做同步登陸的

 

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"');
		setcookie('gwyy',$username,time()+3600,'/','127.0.0.71');
		_setcookie('Example_auth', _authcode($uid."\t".$username, 'ENCODE'));

		$_SESSION['username'] = $username;
		$_SESSION['uid']      = $uid;
	}

	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('Example_auth', '', -86400 * 365);
		unset($_SESSION['username']);
		unset($_SESSION['uid']);
		session_destroy();
	}

這樣 當用戶刷新了別的應用頁面之後 就自動登陸了

注意 如果在UC裡面添加應用 提示通信沒有成功 那麼原因很簡單  就是沒有找到你  http://xxxx/api/uc.php  這個文件 只要有這個文件在 那麼通信 肯定會成功的

其實UC的原理很簡單 就是某個應用登陸後 然後後台輪詢發送給同步登陸的應用的回調文件 回調文件接收到用戶ID之後 生成cookie或者session然後進入登陸模式。

*
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved