php oauth 用戶端和服務端流程與實現
介紹:
1、主要用於第三方擷取使用者資源 普遍用於第三方登入授權擷取使用者資訊
2、是一種協議RFC-5849(不是軟體或服務)
3、認證+授權
流程圖:
用戶端與服務端實現:
1、由流程圖我們可以看出需要以下幾步
0、擷取使用者Key與Secret(流程圖之外)【server/create_consumer.php】
1、擷取Request Token 與 Request Secret 【client/get_request_token.php】2、返回Request Token 與 Request Secret 【server/request_token.php】3、重新導向授權頁 ——"【server/authorize.php】4、使用者授權回調 ——|5、擷取Access Token 與 Access Secret 【client/get_access_token.php】6、返回Access Token 與 Access Secret 【server/access_token.php】7、調用api(流程圖之外)【client/get_api.php】8、返回api擷取的資料(流程圖之外)【server/api.php】
代碼目錄結構
2、代碼實現流程
0:server/create_consumer.php用戶端產生consumer key與consumer secret
';echo 'Consumer secret: ' . sha1(OAuthProvider::generateToken(40));
OAuthProvider : OAuth提供者類
generateToken :產生一個隨機令牌
generateToken這個函數需要注意效能我們注意第二個參數 dev/random 與 dev/urandom效能上有區分 此處不做詳細說明請根據自己項目調優
具體效能資訊請參考:/dev/random Mcrypt響應慢的一個原因
sha1:使用HMAC-SHA1演算法產生簽名
百度:OAuth請求可以使用HMAC-SHA1或MD5演算法產生簽名。
新浪微博:OAuth請求都使用HMAC-SHA1演算法產生簽名
開心網:簽名方法,暫只支援HMAC-SHA1
運行結果
1:client/get_request_token.php 擷取Request Token 與 Request Secret
getRequestToken($request_url . '?callback_url=' . $callback_url . '&scope=all');session_start();$_SESSION['oauth_token_secret'] = $tokenInfo['oauth_token_secret'];//此時重新導向到服務端授權並顯示給使用者header('Location: '.$authorize_url.'?oauth_token=' . $token_info['oauth_token']);?>
以上代碼我們會通過
getRequestToken($request_url . '?callback_url=' . $callback_url . '&scope=all')運行服務端代碼
2:server/request_token.php 返回 request_token
通過2中的代碼1擷取到$oauth_token與$oauth_token_secret與oauth_callback_confirmed
之後重新導向到3
3:server/authorize.php
授權驗證 此處應該是需要使用者輸入帳號密碼之後再回調的我為了代碼最基本實現省略了使用者之間預設授權
此處校正是簡略的 預設已經授權直接獲第三方回調地址 (正常情況是使用者授權後服務端通過資料庫擷取第三方回調地址並把 oauth_token授權了 之前oauth_token一直是未授權狀態)
上面代碼通過回調地址把已經授權的request_token(oauth_token)傳到5(4使用者授權此處掠過自己可以加個表單提交作為授權驗證)
5:client/get_access_token.php 擷取access token
setToken($_GET['oauth_token'], $_SESSION['oauth_token_secret']);$tokenInfo = $OAuth->getAccessToken($access_url);var_dump($tokenInfo);
$tokenInfo = $OAuth->getAccessToken($access_url);方法問了6
6:server/access_token.php 返回access token
2:get_request_token一直到6:server/access_token.php流程擷取request_token——》返回request_token——》使用者授權校正authorize——》校正成功回調——》擷取access token——》返回access token
運行結果如下
一直重新導向到get_access_token並擷取了access_token與access_secret
現在我們用戶端(第三方平台)擷取了如下資料$consumer_key :2b4e141bf09beecdeb3479cd106038100febf399
$consumer_secret :fab40ca819c25d5fb4abf3e7cae8da5c25b67d05
$request_token :?程式中間資料(此資料一般是有時效的)$request_secret :?程式中間資料(此資料一般是有時效的)
$access_token :12b6f8f6d6930e0e4d1d024c0f520527d0b84d19 (此資料一般時效為無限長)$access_secret :c77463aff2c1abbd670cfb03df4bb4247910cb78 (此資料一般時效為無限長)
現在我們通過這些參數運行7:get_api.php到8:api.php7:client/get_api.php 擷取api使用者資料
setToken($access_token, $access_secret);$result = $OAuth->fetch($api_url, array(), OAUTH_HTTP_METHOD_POST);echo $OAuth->getLastResponse();
8:server/api.php 返回使用者資料
consumer_secret = 'fab40ca819c25d5fb4abf3e7cae8da5c25b67d05'; return OAUTH_OK;}function timestampNonceHandler($Provider) { return OAUTH_OK;}function tokenHandler($Provider) { $Provider->token = '12b6f8f6d6930e0e4d1d024c0f520527d0b84d19'; $Provider->token_secret = 'c77463aff2c1abbd670cfb03df4bb4247910cb78'; return OAUTH_OK;}$OAuthProvider = new OAuthProvider();$OAuthProvider->consumerHandler('consumerHandler');$OAuthProvider->timestampNonceHandler('timestampNonceHandler');$OAuthProvider->tokenHandler('tokenHandler');try { $OAuthProvider->checkOAuthRequest();} catch (Exception $exc) { die(var_dump($exc));}echo 'User Data..';
運行結果下載註:php oauth v1.0 配置 後並開啟 php_curl 才能運行此(以上)代碼
http://www.bkjia.com/PHPjc/735878.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/735878.htmlTechArticlephp oauth 用戶端和服務端流程與實現 介紹: 1、主要用於第三方擷取使用者資源 普遍用於第三方登入授權擷取使用者資訊 2、是一種協議RFC-5849(...