程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php oauth v1.0 詳解客戶端和服務端流程與實現

php oauth v1.0 詳解客戶端和服務端流程與實現

編輯:關於PHP編程

php oauth 客戶端和服務端流程與實現

介紹:

1、主要用於第三方獲取用戶資源 普遍用於第三方登錄授權獲取用戶信息

2、是一種協議RFC-5849(不是軟件或服務)

3、認證+授權


流程圖:

各平台流程圖 163 開心網 新浪微博 \ \ \

客戶端與服務端實現:

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.php

7: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 才能運行此(以上)代碼


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved