2011-03-28 141 views
1

我花了過去幾個小時嘗試所有類型的變體,但根據Twitter API,本應從第1步開始!Twitter API - 無法驗證oauth簽名和令牌PHP/CURL

1另外我已經對下面的腳本進行了說明,我添加了: $ header = array(「Expect:」);

這個我發現在獲取被拒絕的問題/ 100-繼續的stackoverflow上的另一個問題的幫助。

問題: 無法驗證oauth簽名和令牌是每次的迴應!我的文章數據的

例子:

Array ([oauth_callback] => http://www.mysite.com//index.php [oauth_consumer_key] => hidden [oauth_nonce] => hidden [oauth_signature_method] => HMAC-SHA1 [oauth_timestamp] => 1301270847 [oauth_version] => 1.0) 

我的頭數據:

Array ([0] => Expect:) 

腳本:

$consumer_key = "hidden"; 
$consumer_secret = "hidden"; 
function Post_Data($url,$data,$header){ 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS,$data); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    $result = curl_exec($ch); 
    curl_close($ch); 
    return $result; 
    } 
$data['oauth_callback'] = "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']; 
$data['oauth_consumer_key'] = $consumer_key; 
$data['oauth_nonce'] = md5(time()); 
$data['oauth_signature_method'] = "HMAC-SHA1"; 
$data['oauth_timestamp'] = time(); 
$data['oauth_version'] = "1.0"; 
$header = array("Expect:"); 
$content = Post_Data("http://api.twitter.com/oauth/request_token",$data,$header); 
print_r($content); 

任何人都可以看到一個明顯的錯誤,我可以在這裏做?最好我不喜歡用別人的代碼代碼,因爲大多數例子都具有完整的類別&巨大的功能,我正在尋找最簡單的方法!

回答

1

您的問題是您沒有在您的請求中包含OAuth簽名。
你可以閱讀關於this page的概念。
工作實現可以在here找到。

0

我面臨同樣的問題,我所缺少的是將頭傳遞給curl請求。 正如這個問題所示,我還發送了$ header = array('Expect:'),這是我的情況。我開始用下面的其他數據在頭部發送簽名,併爲我解決了這個問題。

$header = calculateHeader($parameters, 'https://api.twitter.com/oauth/request_token'); 

function calculateHeader(array $parameters, $url) 
    { 
     // redefine 
     $url = (string) $url; 

     // divide into parts 
     $parts = parse_url($url); 

     // init var 
     $chunks = array(); 

     // process queries 
     foreach($parameters as $key => $value) $chunks[] = str_replace('%25', '%', urlencode_rfc3986($key) . '="' . urlencode_rfc3986($value) . '"'); 

     // build return 
     $return = 'Authorization: OAuth realm="' . $parts['scheme'] . '://' . $parts['host'] . $parts['path'] . '", '; 
     $return .= implode(',', $chunks); 

     // prepend name and OAuth part 
     return $return; 
    } 

function urlencode_rfc3986($value) 
    { 
     if(is_array($value)) return array_map('urlencode_rfc3986', $value); 
     else 
     { 
      $search = array('+', ' ', '%7E', '%'); 
      $replace = array('%20', '%20', '~', '%25'); 

      return str_replace($search, $replace, urlencode($value)); 
     } 
    }