2010-07-21 6 views
5

निम्नलिखित समारोह टोकन के बजाय एक प्रमाणीकरण त्रुटि देता है:एक और चहचहाना oAuth cURL पहुँच टोकन अनुरोध है कि विफल रहता है

oAuth हस्ताक्षर और टोकन

function request_token() 
{ 
    // Set url 
    $url = $this->site.$this->request_token_path; // http://api.twitter.com/oauth/request_token 

    // Params to pass to twitter and create signature 
    $params['oauth_consumer_key'] = $this->consumerKey; 
    $params['oauth_token'] = ''; 
    $params['oauth_nonce'] = SHA1(time()); 
    $params['oauth_timestamp'] = time(); 
    $params['oauth_signature_method'] = $this->signatureMethod; // HMAC-SHA1; 
    $params['oauth_version'] = $this->version; // 1.0 
    ksort($params); 

    //print "<pre>"; print_r($params); print "</pre>"; 

    // Create Signature 
    $concatenatedParams = ''; 
    foreach($params as $k => $v){ 
     $concatenatedParams .= "{$k}={$v}&"; 
    } 
    $concatenatedParams = substr($concatenatedParams,0,-1); 

    $signatureBaseString = "POST&".urlencode($url)."&".urlencode($concatenatedParams); 
    $params['oauth_signature'] = base64_encode(hash_hmac('SHA1', $signatureBaseString, $this->secret."&", TRUE)); 

    // Do cURL 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLINFO_HEADER_OUT, 0); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); 
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $params); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1); 
    $exec = curl_exec ($ch); 
    $info = curl_getinfo($ch); 
    curl_close ($ch); 

    print $exec; 

    //print "<pre>"; print_r($info); print "</pre>"; 
} 
+0

बस एक सिर ऊपर। ट्विटर को ओथ के साथ समस्याएं हैं। यह आपकी समस्या नहीं हो सकती है। http://dev.twitter.com/status –

+0

धन्यवाद - मुझे यह नहीं लगता कि ... –

उत्तर

24

नीचे क्या Ive एक साथ अब तक डाल दिया और यह :-) यदि आपका अभी भी इस में देख

class Twitauth 
    { 
     var $key = ''; 
     var $secret = ''; 

     var $request_token = "https://twitter.com/oauth/request_token"; 

    function Twitauth($config) 
    { 
     $this->key = $config['key']; // consumer key from twitter 
     $this->secret = $config['secret']; // secret from twitter 
    } 

    function getRequestToken() 
    { 
     // Default params 
     $params = array(
      "oauth_version" => "1.0", 
      "oauth_nonce" => time(), 
      "oauth_timestamp" => time(), 
      "oauth_consumer_key" => $this->key, 
      "oauth_signature_method" => "HMAC-SHA1" 
     ); 

     // BUILD SIGNATURE 
      // encode params keys, values, join and then sort. 
      $keys = $this->_urlencode_rfc3986(array_keys($params)); 
      $values = $this->_urlencode_rfc3986(array_values($params)); 
      $params = array_combine($keys, $values); 
      uksort($params, 'strcmp'); 

      // convert params to string 
      foreach ($params as $k => $v) {$pairs[] = $this->_urlencode_rfc3986($k).'='.$this->_urlencode_rfc3986($v);} 
      $concatenatedParams = implode('&', $pairs); 

      // form base string (first key) 
      $baseString= "GET&".$this->_urlencode_rfc3986($this->request_token)."&".$this->_urlencode_rfc3986($concatenatedParams); 
      // form secret (second key) 
      $secret = $this->_urlencode_rfc3986($this->secret)."&"; 
      // make signature and append to params 
      $params['oauth_signature'] = $this->_urlencode_rfc3986(base64_encode(hash_hmac('sha1', $baseString, $secret, TRUE))); 

     // BUILD URL 
      // Resort 
      uksort($params, 'strcmp'); 
      // convert params to string 
      foreach ($params as $k => $v) {$urlPairs[] = $k."=".$v;} 
      $concatenatedUrlParams = implode('&', $urlPairs); 
      // form url 
      $url = $this->request_token."?".$concatenatedUrlParams; 

     // Send to cURL 
     print $this->_http($url);   
    } 

    function _http($url, $post_data = null) 
    {  
     $ch = curl_init(); 

     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); 
     curl_setopt($ch, CURLOPT_TIMEOUT, 30); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 

     if(isset($post_data)) 
     { 
      curl_setopt($ch, CURLOPT_POST, 1); 
      curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); 
     } 

     $response = curl_exec($ch); 
     $this->http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
     $this->last_api_call = $url; 
     curl_close($ch); 

     return $response; 
    } 

    function _urlencode_rfc3986($input) 
    { 
     if (is_array($input)) { 
      return array_map(array('Twitauth', '_urlencode_rfc3986'), $input); 
     } 
     else if (is_scalar($input)) { 
      return str_replace('+',' ',str_replace('%7E', '~', rawurlencode($input))); 
     } 
     else{ 
      return ''; 
     } 
    } 
} 
+0

अच्छा! यह काम करता है, getRequestToken विधि के अंत में "वापसी" के बजाय "प्रिंट" होता है। – Pons

+0

कूल, खुशी है कि यह :-) मदद की –

+0

मैं इस बात सी # में काम कर (पता नहीं है PHP) प्राप्त करने के लिए कोशिश कर रहा हूँ तो मैं एक छोटा सा confused.Is वर $ गुप्त चहचहाना से, गोपनीयता का कर रहा हूँ? –

2

मैं सत्यापन में विफल रहा मान लेंगे कि यह वास्तव में एक उत्तर नहीं है, लेकिन यदि आप कर सकते हैं, तो पीईसीएल ओथ पैकेज का उपयोग करें। Rasmus Lerdorf wrote a tutorial on how to use it और यह मुझे इस मुद्दे के आसपास मिला।

5

यकीन नहीं काम करता है, या अगर यह आप के लिए काम करेंगे, लेकिन मैं एक समान सेटअप था और था एक ही मुद्दा। अंत में मैंने पाया कि मैं कई बार urlencoding था। इस अनुभाग को टिप्पणी का प्रयास करें:

$keys = $this->_urlencode_rfc3986(array_keys($params)); 
     $values = $this->_urlencode_rfc3986(array_values($params)); 
     $params = array_combine($keys, $values); 

मेरे लिए काम किया है, तो शायद यह मदद मिलेगी।

+2

http://stackoverflow.com/users/195192/good-bye को अपनी पोस्ट संशोधित करनी चाहिए, इस जवाब के लिए धन्यवाद! – Erik

0

मैं एक ही मुद्दे का सामना करना पड़ा, मैं क्या याद आ रही थी कर्ल अनुरोध करने के लिए शीर्ष लेख से गुजर रहा है। जैसा कि इस प्रश्न में दिखाया गया है, मैं $ हेडर = सरणी ('उम्मीद:') भी भेज रहा था, जो मेरे मामले में समस्या थी। मैंने नीचे दिए गए अन्य डेटा के साथ शीर्षलेख में हस्ताक्षर भेजना शुरू कर दिया और यह मेरे लिए मामला हल कर दिया।

$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)); 
     } 
    } 
संबंधित मुद्दे