1. 程式人生 > >同步登入狀態 , 通過access token方式

同步登入狀態 , 通過access token方式

在登入erp的時候,想要通過點選的方式,直接登入到另外一個網站。

也就是登入A網站,點選一個進入B網站的連線,B網站直接就是登入狀態,不需要登入了。

test:  http://www.xxx.com/test.php?usercode=10014&username=zhao       usercode唯一

1.

首先A登入的時候通過api獲取key,設定超時時間為10秒

$remoteDomain = "http://market.fancyecommerce.com";
$username = 'admin';
$key = "dsf2djdp3";
$url = $remoteDomain."/fecadmin/login/remoteindex?key=".$key."&username=".$username;

$ch = curl_init();      
curl_setopt($ch, CURLOPT_URL,$url);       
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);       
curl_setopt($ch, CURLOPT_TIMEOUT,10); 
$data = curl_exec($ch);
curl_close($ch);
通過上面的程式碼回去B網站獲取access_token資訊。

2.B網站的程式碼:

2.1 安全驗證key,以及引數是否存在

2.2 本地資料庫查詢使用者,如果沒有,則新建一個使用者。

2.3 隨機生成一個新的accessToken, 儲存

2.4 返回生成的accessToken

public function getCurrentUser($username,$usercode){
		$user = AdminUser::findOne(['username' => $username]);
		if($user->username){
			
		}else{
			$adminUser = new AdminUser;
			$adminUser->username = $username;
			$adminUser->code = $usercode;
			$adminUser->setPassword(md5(CDate::getCurrentDateTime()));
			//$adminUser->save();
			$user = AdminUser::findOne(['username' => $username]);
		}
		$user->generateAccessToken();
		$user->save();
		return $user;
	}
	
	
	# 通過遠端,獲取當前使用者的access_token
	# 傳遞username   usercode(可選)
	# 返回json格式的access_token
	public function actionRemoteindex(){
		
		$key = CRequest::param("key");
		$configKey = CConfig::param("remote_get_access_token_key");
		$username = CRequest::param("username");
		$usercode = CRequest::param("usercode") ? CRequest::param("usercode") : '';
		
		
		if(($configKey) && ($key == $configKey) && $username){
			
			$user = $this->getCurrentUser($username,$usercode);
			if(isset($user['access_token']))
				echo  json_encode(["access_token" =>$user['access_token']]);
		}
		
	}

3

現在回到A網站,下面是完成程式碼:

<?php  

$remoteDomain = "http://market.fancyecommerce.com";
$username = 'admin';
$key = "dsf2ddp3";
$url = $remoteDomain."/fecadmin/login/remoteindex?key=".$key."&username=".$username;

$ch = curl_init();      
curl_setopt($ch, CURLOPT_URL,$url);       
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);       
curl_setopt($ch, CURLOPT_TIMEOUT,10); 
$data = curl_exec($ch);
curl_close($ch);
if($data){
	
	$arr = json_decode($data,true);
	
	$access_token = $arr['access_token']; 
	$url = $remoteDomain."/fecadmin/login/loginbyaccesstoken?access_token=".$access_token."&username=".$username;
}

?>

<a target="_blank" href="<?= $url ?>">Data WEBSite</a>


生成一個點選連結。

4.點選這個連結跳轉到b網站。B網站驗證這個access_token是否有效

如果有效,則設定當前使用者為登入狀態。跳轉到使用者的dashboard介面

程式碼如下:

# 通過access_token 設定登入狀態
	public function actionLoginbyaccesstoken(){
		$access_token = CRequest::param("access_token");
		$username = CRequest::param("username");
		if($access_token  ){
			if($username){
				$one = AdminUser::findOne([
					'username' => $username,
					'access_token' => $access_token,
				]);
				
				if($one->username){
					$one->generateAccessToken();
					$one->save();
					\Yii::$app->user->login($one, 3600 * 24);
					header('Location: '.CUrl::getHomeUrl());
				}else{
					echo "User Access Token Is TimeOut";
				}
			}else{
				echo "UserName Can Not Empty";
			}
		}else{
			echo "Access Token Can Not Empty";
		}
	}

5.跳轉後,就顯示登入狀態了。