第三方登錄之微博登錄

前言:

隨著互聯網的高速發展我們我們注冊了各種各種的會員,很多時候我們都不記得是否注冊果這個網站的會員,或者忘記了用戶名或者密碼,我們越來越不想填注冊表單了.相信大多數用戶都和我一樣懶.這個時候解決這個問題的方案出現了,那就是第三方登陸

目錄:

  1. 申請平臺接入
  2. OAuth2.0協議
  3. 開發微博登錄

1. 申請接入平臺

我們以微博為例,我想讓我的京西商城可以用微博登陸,這時候就必須要到微博的開放平臺去申請接入.
微博的開放平臺

image.png
image.png
image.png

登錄微博后,創建新應用,填寫了一系列資料過后就可以獲得一個app key和 app secret ,當然別忘了填寫微博的回調地址.申請接入這一部分我就不詳細展開了.


image.png

我說說接入的要求,首先必須得有一個外網能訪問的url,可以是自己的域名,也可以是別人的二級域名.還有就是沒有備案的服務器是不能完成上線審核的,不過只是用于學習話,倒無所謂

2. OAuth協議

當我們需要開發一個第三方登錄的時候,我們必須要了解它的原理,他的原理就是OAuth2.0協議

image.png

(A)用戶打開客戶端以后,客戶端要求用戶給予授權。
(B)用戶同意給予客戶端授權。
(C)客戶端使用上一步獲得的授權,向認證服務器申請令牌。
(D)認證服務器對客戶端進行認證以后,確認無誤,同意發放令牌。
(E)客戶端使用令牌,向資源服務器申請獲取資源。
(F)資源服務器確認令牌無誤,同意向客戶端開放資源。
協議內容大致就是這樣,關鍵是B用戶同意給客戶端授權,也就是我們輸入正確的賬號密碼表示同意授權這個網站

這里我們用微博打比方

協議流程圖

在開始開發微博登陸之前,我們需要下載官方的SDK:PHP微博SDK
下載之后其他的不管,我們直接將最核心的文件放入我們項目的插件目錄

image.png

3. 使用官方SDK開發微博登錄

我將微博登錄分為三個步驟
1.當用戶點擊微博登陸
2.用戶輸入賬號密碼
3.返回京西商城,完成登陸

那么我們將微博登陸的步驟拆分出來,看看我們作為開發人員應該如何來做:
當用戶點擊微博登陸的時候,我們應該獲取一個微博登陸的url

一:當用戶點擊微博登錄:

  1. 我們引入之前放好的sdk
//引入微博sdk
include_once __DIR__ . '/../../common/vendors/saetv2.ex.class.php';
  1. 實例化sdk中的授權對象,并調用它上面的獲取登陸頁面的url方法
    2.1實例化對象時候需要填ak和sk,我是預先存入了Yii的params文件中,方便調用
    2.2 調用getAuthorizeUrl()方法時需要傳入之前預先設好的回調地址,用戶審核
$wbObj = new \SaeTOAuthV2(Yii::$app->params['weibo']['ak'], Yii::$app->params['weibo']['sk']);
//調用sdk中的獲取登陸頁面的url
$wbUrl = $wbObj->getAuthorizeURL(Url::to(['user/weibocallback'], true));
  1. 獲取到了微博登陸的url后,我們只需要重定向到這個url就可以了
//跳轉到微博的登錄頁
$this->redirect($wbUrl);

這時候的效果就是

image.png
image.png

二:當用戶輸入了正確的用戶名密碼

當用戶點擊了登錄且賬號密碼正確,這個時候,就代表了用戶向我們網站授權了,我們就可以在一定范圍內以用戶的身份去做一些事情.

  1. 用戶授權以后,微博服務器會重定向到我們之前所填寫的回調地址中,并且帶上一個名為code的參數
image.png

這個code是一個加密的字符串用于驗證的,它的生命周期很短,而且只能使用一次,為了就是防止黑客抓包改包之類的.

  1. 獲取微博服務器傳過來的code,用這個code來換取access_token
    2.1 換取access_token 我們又要使用sdk中的授權對象上面的getAccessToken()方法,這個方法需要傳入兩個參數 .第一是包含code和回調地址的數組,第二個參數是有type,在方法中默認為code.也就是我們不需要寫
 //首先接收get傳遞的code

$code = Yii::$app->request->get('code');

//通過code換取accesstoken

$wbObj = new \SaeTOAuthV2(Yii::$app->params['weibo']['ak'], Yii::$app->params['weibo']['sk']);

//將code寫入數組

$keys['code'] = $code;

//將回調地址寫入數組

$keys['redirect_uri'] = Yii::$app->params['weibo']['callback'];

//捕獲獲取accessToken失敗的異常

try{

  $result = $wbObj->getAccessToken($keys);

}catch (\OAuthException $exception){

  echo $exception->getMessage();die();
}
打印返回的數據
結果

參數分別是
1.access_token,
2.提醒過期時間戳,
3.過期時間戳,
4.微博用戶的id

  1. 通過將access_token存入redis緩存中并將就那個token的過期時間,設置緩存的過期時間
//將access_token存入redis
Yii::$app->cache->set($result['uid'] . 'access_token', $result['access_token'], $result['remind_in']);
  1. 獲取了access_token之后就可以正式的調用第三方開放的接口了,比如獲取微博用戶的信息等等
$access_token = Yii::$app->cache->get($uid . 'access_token');
//實例化sdk中調用微博操作類,構造函數需要傳入ak,sk,access_token
 $czObj = new \SaeTClientV2
 (
 Yii::$app->params['weibo']['ak'],
 Yii::$app->params['weibo']['sk'],
 $access_token
 );
 //調用sdk中的獲取用戶信息方法
 $userInfo = $czObj->show_user_by_id($uid);

返回結果是以數組形式的數據,里面數據非常豐富,大家可以根據自己的業務需求進行開發

image.png

SDK包中還有很多封裝好了的方法可以調用,有興趣的朋友可以自己去查看
對http協議和CURL比較熟悉的朋友也可以自己參照官方文檔自己封裝一些有趣的方法

今天的第三方登陸上篇就介紹到這里,我在空閑的時候,補充和完善剩下的內容,如果文中有哪些不正確的地方,歡迎大神指正.謝謝

以上

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容