搜尋
首頁後端開發php教程TP5實戰專案中QQ第三方登入功能的實作案例分享

最近用thinkPHP 5框架做了一個婚紗店的項目,在開發過程中需要用到第三方登錄,騰訊官方給的案例是幾個文件相互包含實現的,放到tp5裡面很悲催的發現在控制器中不能透過include或require完成預期功能,想要用騰訊官方封的類別就必須對其進行修改,修改如下:

1. 找到官方SDK裡面的核心檔案

框架外使用的時候是include 'qqConnectAPI.php',開啟這個檔案可以看到它是包含了另外幾個文件的,comm資料夾下的幾個文件無非就是定義一些常數,記錄一下你的APP KEY這些信息,都無關緊要,只要把class文件夾下的幾個類文件放到tp5裡面就好了,而且仔細看一下程式碼會發現其實只要拿到三個類別就完全可以實現功能了。

2. 放到tp框架裡

tp5推薦將第三方的東西,同時又不是composer安裝的統一放到extend目錄下,因為可能以後還要做其他擴展,這裡將qq登入相關的單獨建一個qqlogin資料夾,

可以看到裡面只有三個類,我去掉了一個Recorder和一個ErrorCase類,見名知意,這兩個的作用是記錄一些信息,如access_token,還有異常處理,這裡我就直接刪掉了。另外注意,依照psr4規範,類別名稱要跟檔名一致,所以要把檔名改一下,同時加上命名空間extend\qqlogintp5所有的類別都要有命名空間

另外為了防止tp5找不到我們需要的文件,最好在config.php檔案裡註冊一條根命名空間,在第30行:

// 注册的根命名空间
'root_namespace'  => [
 'extend\qqlogin' => '../extend/qqlogin/',
 'extend\baidu' => '../extend/bdlogin/'
],

# 3. 改造原始碼

因為QC.php是繼承了Oauth.php,我們從後者改起,去掉require_once,加上命名空間這個就不說了,首先看成員屬性,類別常數是騰訊平台的位址,不用管,原來有三個屬性,recorder、error不需要,註解掉或直接刪除。下文同樣,要想像跟這兩個字有仇,看到就註釋或刪掉。

// protected $recorder;
public $urlUtils;
// protected $error;
public $state;
public $appid = "****";
public $callback = "http://****/index/user/qqcallback";
public $scope = "get_user_info";

下面四個屬性是需要添加的,state用來防止CSRF攻擊,下面三個看官方文件就知道是什麼東西了,這些原來是在comm資料夾下的inc.php存放的,現在直接拿過來變成成員屬性。

然後建構函數,實例化三個類,有兩個已經不存在了,而且上面說了,跟這兩個單字有仇,看到就要註解或刪掉。

再看下面的第一個成員方法qq_login()

public function qq_login(){
 $appid = $this->recorder->readInc("appid");
 $callback = $this->recorder->readInc("callback");
 $scope = $this->recorder->readInc("scope");
 //---生成唯一随机串防CSRF攻击
 $state = md5(uniqid(rand(), TRUE));
 $this->recorder->write('state',$state);
 *
 *
 return $login_url;
 // header("Location:$login_url");
}

我們已經有仇把有那兩個單字的這幾行刪掉了,我們又需要這些東西,不要忘了我們上面增加了三個成員屬性,這些值我們已經有了下面用的時候通過$this->appid就好了。 state驗證的時候我們可以透過session去驗證,在tp5裡面提供了助手函數去寫session:

session('state',$this->state);

最後一句是header跳轉,暫不知道什麼原因在tp5裡面並不能看到跳轉效果,於是直接將url返回,然後在控制器裡面透過tp5的重定向函數$this->redirect()實現跳躍。

下面看qq_callback()

public function qq_callback(){
 // $state = $this->recorder->read("state");
 //---验证state防止CSRF攻击
 if(input('state') != session('state')){
  // $this->error("30001");
  exit('30001');
 }
 *
 *
 // return $params["access_token"];
 session('access_token',$params["access_token"]);
}

出現那兩個單字的已經註解了,我們在qq_login裡面有寫session,這裡直接取sessio比較就行了,input()也是tp5的助手函數,可以獲得get、post請求的參數,結果是一個數組,但是不能夠再動態為其添加鍵值對,想要添加的話必須將其賦給一個變量,再對變量進行操作。這裡有錯誤的話直接exit印出錯誤號,官方文件有詳細的錯誤號說明。在最後也是直接將取得到的access_token寫進session。

下面的get_openid()方法類似,參數列表用session構建,回傳值直接寫入session。

然後再修改QC.php,只要修改建構方法,把陣列的三個變數給一下值就好了。

$this->keysArr = array(
 "oauth_consumer_key" => (int)$this->appid,
 "access_token" => session('access_token'),
 "openid" => session('openid')
);

4. 控制器呼叫

# 改造完成,可以在控制器裡面使用了,附上程式碼入下:

use extend\qqlogin\QC;
// 处理qq登录
public function qqlogin()
{
 $qq = new QC();
 $url = $qq->qq_login();
 $this->redirect($url);
}
// qq登录回调函数
public function qqcallback(UserModel $user)
{
 $qq = new QC();
 $qq->qq_callback();
 $qq->get_openid();
 $qq = new QC();
 $datas = $qq->get_user_info();
 * // 拿到用户信息后的处理
 *
}

易忘點:

在回呼函數裡面要實例化兩次QC才能拿到使用者訊息,第二次實例化的時候才有openidaccess_token兩個參數。

以上是TP5實戰專案中QQ第三方登入功能的實作案例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
解釋負載平衡如何影響會話管理以及如何解決。解釋負載平衡如何影響會話管理以及如何解決。Apr 29, 2025 am 12:42 AM

負載均衡會影響會話管理,但可以通過會話複製、會話粘性和集中式會話存儲解決。 1.會話複製在服務器間複製會話數據。 2.會話粘性將用戶請求定向到同一服務器。 3.集中式會話存儲使用獨立服務器如Redis存儲會話數據,確保數據共享。

說明會話鎖定的概念。說明會話鎖定的概念。Apr 29, 2025 am 12:39 AM

Sessionlockingisatechniqueusedtoensureauser'ssessionremainsexclusivetooneuseratatime.Itiscrucialforpreventingdatacorruptionandsecuritybreachesinmulti-userapplications.Sessionlockingisimplementedusingserver-sidelockingmechanisms,suchasReentrantLockinJ

有其他PHP會議的選擇嗎?有其他PHP會議的選擇嗎?Apr 29, 2025 am 12:36 AM

PHP會話的替代方案包括Cookies、Token-basedAuthentication、Database-basedSessions和Redis/Memcached。 1.Cookies通過在客戶端存儲數據來管理會話,簡單但安全性低。 2.Token-basedAuthentication使用令牌驗證用戶,安全性高但需額外邏輯。 3.Database-basedSessions將數據存儲在數據庫中,擴展性好但可能影響性能。 4.Redis/Memcached使用分佈式緩存提高性能和擴展性,但需額外配

在PHP的上下文中定義'會話劫持”一詞。在PHP的上下文中定義'會話劫持”一詞。Apr 29, 2025 am 12:33 AM

Sessionhijacking是指攻擊者通過獲取用戶的sessionID來冒充用戶。防範方法包括:1)使用HTTPS加密通信;2)驗證sessionID的來源;3)使用安全的sessionID生成算法;4)定期更新sessionID。

PHP的完整形式是什麼?PHP的完整形式是什麼?Apr 28, 2025 pm 04:58 PM

文章討論了PHP,詳細介紹了其完整形式,在We​​b開發中的主要用途,與Python和Java的比較以及對初學者的學習便利性。

PHP如何處理形式數據?PHP如何處理形式數據?Apr 28, 2025 pm 04:57 PM

PHP使用$ \ _ post和$ \ _獲取超級全局的php處理數據,並通過驗證,消毒和安全數據庫交互確保安全性。

PHP和ASP.NET有什麼區別?PHP和ASP.NET有什麼區別?Apr 28, 2025 pm 04:56 PM

本文比較了PHP和ASP.NET,重點是它們對大規模Web應用程序,性能差異和安全功能的適用性。兩者對於大型項目都是可行的,但是PHP是開源和無關的,而ASP.NET,

PHP是對病例敏感的語言嗎?PHP是對病例敏感的語言嗎?Apr 28, 2025 pm 04:55 PM

PHP的情況敏感性各不相同:功能不敏感,而變量和類是敏感的。最佳實踐包括一致的命名和使用對案例不敏感的功能進行比較。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版