同步登入狀態 , 通過access token方式
阿新 • • 發佈:2019-02-05
在登入erp的時候,想要通過點選的方式,直接登入到另外一個網站。
也就是登入A網站,點選一個進入B網站的連線,B網站直接就是登入狀態,不需要登入了。
test: http://www.xxx.com/test.php?usercode=10014&username=zhao usercode唯一
1.
首先A登入的時候通過api獲取key,設定超時時間為10秒
通過上面的程式碼回去B網站獲取access_token資訊。$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);
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.跳轉後,就顯示登入狀態了。