2012-01-29 88 views
1

首先,注意:我的主機沒有安裝PECL OAUTH或HTTP擴展。無法在PHP中生成Tumblr API請求令牌

這樣做的目的:我希望創建一個界面,以便輕鬆關注並取消關注給定的Tumblr名稱列表。

問題:無法通過驗證步驟。

代碼:

$request_url = 'http://www.tumblr.com/oauth/request_token'; 
$consumer_key = COSUMER_KEY; 
$consumer_secret = CONSUMER_SECRET; 
$oauth_key = urlencode_rfc3986($consumer_secret) . '&'; 
$time = time(); 
$nonce = md5(microtime() . mt_rand()); 
$callback_url = 'http://krisallengallery.com/easyfollowr/index.php'; 
$params = array('oauth_consumer_key' => $consumer_key, 
       'oauth_signature_method' => 'HMAC-SHA1', 
       'oauth_timestamp' => $time, 
       'oauth_nonce' => $nonce, 
       'oauth_version' => '1.0a', 
       'oauth_callback' => $callback_url);    
uksort($params, 'strcmp'); 

$oauth_header = 'Authorization: OAuth '; 

$raw_signature = 'GET&' . urlencode_rfc3986($request_url) . '&'; 
$raw_suffix = array(); 
foreach($params as $key => $param) 
{ 
    $raw_suffix[] = $key . '=' . $param; 
} 
$raw_signature .= urlencode_rfc3986(implode('&', $raw_suffix)); 
$oauth_signature = urlencode_rfc3986(base64_encode(hash_hmac('sha1', $raw_signature, $oauth_key, true))); 

$params['oauth_signature'] = $oauth_signature; 
uksort($params, 'strcmp'); 

$raw_head = array(); 
foreach($params as $key => $param) 
{ 
    $raw_head[] = $key . '="' . $param . '"'; 
} 
$oauth_header .= implode(',', $raw_head); 

$session = curl_init($request_url); 
curl_setopt($session, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($session, CURLOPT_HEADER, true); 
curl_setopt($session, CURLOPT_HTTPHEADER, array($oauth_header)); 
$response = curl_exec($session); 
curl_close($session); 
echo $response; 

function urlencode_rfc3986($input) 
{ 
    return str_replace('+', ' ', str_replace('%7E', '~', rawurlencode($input))); 
} 

我會錯在何處的任何想法?

ETA:作了一些修改。它仍然沒有工作,但我現在得到的錯誤是oauth_signature does not match expected value

回答

0

我不完全確定我做錯了什麼,但幸運的是,我發現fangel's OAuth script on GitHub實現了我需要生成令牌的所有東西。不過,它看起來像是在正確的軌道上。

ETA:此外,還有jacobbudin's TumblrOAuth library on GitHub,它使用fangel的腳本和一些分叉然後更新的代碼,它爲您的應用程序處理用戶的所有Tumblr身份驗證。

我敢肯定,當我開始嘗試構建我的Followr腳本時,我會回來更多的問題。

1

我無法測試它,所以我會給你幾件事情,看看是否有任何改善。

'$oauth_timestamp'在你的$params數組實際上應該是'oauth_timestamp'(no $ sign)。另外,生成查詢字符串時,不應將值用引號括起來。

你應該在foreach($ params)方法循環改變這個代替:

foreach($params as $key => $param) 
{ 
    $raw_signature .= $key . '=' . urlencode($param) . '&'; 
    $oauth_header .= $key . '=' . $param . ','; 
} 

$raw_signature = rtrim($raw_signature, '&'); 
$oauth_signature = base64_encode(hash_hmac('sha1', $raw_signature, $oauth_key)); 
$oauth_header .= 'oauth_signature=' . $oauth_signature; 

另外,我覺得你應該使用GET請求而不是POST的爲捲曲。

希望有所幫助。

+0

哎呀。謝謝!我實際上遇到了另外幾個錯別字,現在我走開並回來了。是的,它確實需要成爲cURL的GET。但它仍然無法正常工作。 – Ally 2012-01-29 22:05:52

+0

@Ally是上面更新的Oauth請求。我確實需要它,或者你有它的工作? – Knights 2014-11-15 04:25:32

0

從$ params數組中排除'oauth_callback'=> $ callback_url及其所有好處。排除它後服務器返回200代碼:

HTTP/1.1 200 OK Server: nginx Date: Fri, 04 Oct 2013 19:52:51 GMT Content-Type: application/x-www-form-urlencoded Transfer-Encoding: chunked Connection: close Set-Cookie: tmgioct=524f1c93c799700263374730; expires=Mon, 02-Oct-2023 19:52:51 GMT; path=/; httponly P3P: CP="ALL ADM DEV PSAi COM OUR OTRo STP IND ONL" oauth_token=smKHczH7Mt1MTGilqERZ28oNjJ4OP31lVtBHYTRAY8BH3f73hc&oauth_token_secret=4AxBTP8YannLZDdvR9IiTJTJIEKXocPJEHHSDd5TKQOrE6kr0N&oauth_callback_confirmed=true