第三方登入(QQ登入)開發流程詳解
近排由於工作的繁忙,已經一個星期沒寫博文做分享了,接下來我對網站接入第三方登入----QQ登入的實現邏輯做一個詳細的講解。
對於整個流程的詳細文件可以到QQ互聯官網(http://wiki.connect.qq.com)檢視,我這裡就簡單地進行描述,主要是分析程式碼的實現過程。
我用的是CI框架(MVC模式),模板引擎用的是smarty。
下圖為整個接入流程:
一、準備工作
接入QQ登入前,網站需首先進行申請,獲得對應的appid與appkey,以保證後續流程中可正確對網站與使用者進行驗證與授權。
申請appid和appkey的用途
appid
appkey:appid對應的金鑰,訪問使用者資源時用來驗證應用的合法性。在OAuth2.0認證過程中,appkey的值即為oauth_consumer_secret的值。
二、放置“QQ登入按鈕”
此步驟自己看文件就OK了。我這裡是通過在按鈕新增a連結實現跳轉登入
V層:index.tpl
1 |
< a href="{$openLoginUrl.connectQQ}"
class="icon connect-qq">< span icon-bg2="icon_qq_n"></ span >
QQ登入</ a >
|
三、使用Authorization_Code獲取Access_Token
需要進行兩步:
1. 獲取Authorization Code;
2. 通過Authorization Code獲取Access Token
Step1:獲取Authorization Code
請求地址:
PC網站:https://graph.qq.com/oauth2.0/authorize
WAP網站:https://graph.z.qq.com/moc2/authorize
請求方法:
GET
請求引數:
請求引數請包含如下內容:
引數 | 是否必須 | 含義 |
---|---|---|
response_type | 必須 | 授權型別,此值固定為“code”。 |
client_id | 必須 | 申請QQ登入成功後,分配給應用的appid。 |
redirect_uri | 必須 | 成功授權後的回撥地址,必須是註冊appid時填寫的主域名下的地址,建議設定為網站首頁或網站的使用者中心。注意需要將url進行URLEncode。 |
state | 必須 | client端的狀態值。用於第三方應用防止CSRF攻擊,成功授權後回撥時會原樣帶回。請務必嚴格按照流程檢查使用者與state引數狀態的繫結。 |
scope | 可選 |
請求使用者授權時向用戶顯示的可進行授權的列表。
可填寫的值是API文件中列出的介面,以及一些動作型的授權(目前僅有:do_like),如果要填寫多個介面名稱,請用逗號隔開。 例如:scope=get_user_info,list_album,upload_pic,do_like 不傳則預設請求對介面get_user_info進行授權。 建議控制授權項的數量,只傳入必要的介面名稱,因為授權項越多,使用者越可能拒絕進行任何授權。 |
display | 可選 |
僅PC網站接入時使用。
用於展示的樣式。不傳則預設展示為PC下的樣式。 如果傳入“mobile”,則展示為mobile端下的樣式。 |
g_ut | 可選 |
僅WAP網站接入時使用。
QQ登入頁面版本(1:wml版本; 2:xhtml版本),預設值為1。 |
返回說明:
1. 如果使用者成功登入並授權,則會跳轉到指定的回撥地址,並在redirect_uri地址後帶上Authorization Code和原始的state值。如:
PC網站:http://graph.qq.com/demo/index.jsp?code=9A5F************************06AF&state=test
WAP網站:http://open.z.qq.com/demo/index.jsp?code=9A5F************************06AF&state=test
注意:此code會在10分鐘內過期。
2. 如果使用者在登入授權過程中取消登入流程,對於PC網站,登入頁面直接關閉;對於WAP網站,同樣跳轉回指定的回撥地址,並在redirect_uri地址後帶上usercancel引數和原始的state值,其中usercancel值為非零,如:
http://open.z.qq.com/demo/index.jsp?usercancel=1&state=test
下面我們來構造請求地址:
C層:login.php
1 2 3 4 5 6 7 |
public
function index() {
$redirect
= "/user_center/index";
$this->smartyData['connectQQ']
= $this->model->connectQQ->getLoginUrl($this->getOpenLoginRedirectUrl(AccountType::ConnectQQ, $redirect));
$this->renderTemplateView('login/index.tpl');
}
|
接下來我對這段程式碼進行分析
1、$redirect = "/user_center/index";
這是到最後登入成功後進行跳轉的url,一般登入成功可以跳轉的首頁或者個人中心
2、$this->getOpenLoginRedirectUrl(AccountType::ConnectQQ, $redirect);
這裡我說明下AccountType::ConnectQQ ,這是個常量而已,我的專案中有微博登入,所以是用一個常量來判斷是QQ登入還是微博登入,它們的實現過程基本一致。
我先附上這個方法的程式碼:
1 2 3 4 5 |
private function getOpenLoginRedirectUrl( $accountType , $redirect )
{
$url = "/login/openCallback/?type=$accountType" ;
if (! empty ( $redirect )) $url = "$url&redirect=" .
rawurlencode( $redirect );
return base_url(
|