2013-08-09 3 views
1

Twitter 용으로 앱 전용 인증을 사용하고 검색 결과를 얻으려고합니다. 나는 Codeigniter를 대부분 사용하지만, 문제의 코드는 단순한 PHP 다.Twitter 앱 전용 인증은 로컬 호스트에서 작동하지만 서버에서는 작동하지 않습니다.

[code] => 99 [label] => authenticity_token_error [message] => Unable to verify your credentials

그래서 내 베어러 토큰을 얻기 위해 첫 번째 요청에 실패하는 것 : 내 로컬 호스트에 그것을 실행,하지만 내 서버에서 실행하고있을 때

그것은 행복하게 나에게 다음과 같은 오류를 제공 검색 결과를 반환 .

이것은 나에게 다소 짜증이 나서 디버깅하기가 어렵습니다. 나는 아마 아주 기본적인 것을 놓치고있을 테니, 어떤 도움도 감사히 받아 들여질 것입니다! 실제로 명시된 바와 같이 문제를 해결하기 위해 관리하지만, 전송 헤더의 문자열 대 배열의 사용에 관한 몇 거위 추격전에 갔다하지 않은

// get consumer key and consumer secret from my config files 
    $consumer = array(
     'key' => $this->config->item($provider.'_key'), 
     'secret' => $this->config->item($provider.'_secret'), 
    ); 

    // encode it into the format Twitter expects 
    $bearerTokenCred = base64_encode($consumer['key'].":".$consumer['secret']); 

    // set up request 
    $opts = array('http' => 
     array(
      'method' => 'POST', 
      'header' => 'Authorization: Basic '.$bearerTokenCred."\r\n". 
          "Content-type: application/x-www-form-urlencoded;charset=UTF-8\r\n", 
      'content' => 'grant_type=client_credentials' 
     ) 
    ); 

    $context = stream_context_create($opts); 

      // send request 
    $result = file_get_contents('https://api.twitter.com/oauth2/token', false, $context); 

    $result2 = json_decode($result, true); 

      // this is where it prints my error - prior to doing anything else 
    print_r($result2); 

    if ($result2["token_type"] != "bearer"){ 
     echo $result2["token_type"]; 
     return; 
    } 

    $opts = array('http' => 
     array(
      'method' => 'GET', 
      'header' => 'Authorization: Bearer '.$result2["access_token"]  
     ) 
    ); 

    $context = stream_context_create($opts); 

    $result3 = file_get_contents('https://api.twitter.com/1.1/search/tweets.json?q='.urlencode($search), false, $context); 
+1

코드가 제 서버에서 완벽하게 작동합니다. 나는 당신이 적당한 열쇠 및 비밀 장치가있는 경우에 검사 할 것입니다 – DevZer0

+0

그것을 검사하기를위한 감사합니다. 난 그냥 새 자격 증명을 가지고 내 설정 파일에 추가하고 난 여전히 로컬로 작동하지만 라이브에 동일한 문제가 발생합니다. 내 서버 구성에서 요청을 다르게 또는 잘못 전송할 수 있습니까? – Rillus

+0

서버에 'allow_fopen_url = 1'이 있는지 확인합니다. @Rillus – DevZer0

답변

1

(http://www.php.net/manual/en/function.stream-context-create.php#99353 : 아래

내 코드입니다) - 아직도 나를 위해 아무것도하지 않았다.

결국 나는 CURL을 사용하여 작업을 수행했습니다.

내 가정은 내 서버 구성과 관련이 있다고하지만 무엇을 말할 수는 없습니다.

$provider = 'twitter'; 

    // Get keys from the config 
    $consumer = array(
     'key' => $this->config->item($provider.'_key'), 
     'secret' => $this->config->item($provider.'_secret'), 
    ); 
    $bearerTokenCred = base64_encode($consumer['key'].":".$consumer['secret']); 

    $data = array ('grant_type' => 'client_credentials'); 
    $data = http_build_query($data); 

    $header = array(
     "Authorization: Basic $bearerTokenCred", 
     "Content-type: application/x-www-form-urlencoded;charset=UTF-8", 
     "Content-Length: " . strlen($data) 
    ); 

    $options = array( 
     CURLOPT_HTTPHEADER => $header, 
     CURLOPT_HEADER => false, 
     CURLOPT_URL => "https://api.twitter.com/oauth2/token", 
     CURLOPT_RETURNTRANSFER => true 
    ); 

    $options[CURLOPT_POSTFIELDS] = $data; 

    $feed = curl_init(); 
    curl_setopt_array($feed, $options); 
    $result = curl_exec($feed); 
    curl_close($feed); 

    $result2 = json_decode($result, true); 

    if ($result2["token_type"] != "bearer"){ 
     echo "error - invalid token type"; 
     return; 
    } 

    $header = array(
     'Authorization: Bearer '.$result2["access_token"] 
    ); 

    $options = array( 
     CURLOPT_HTTPHEADER => $header, 
     CURLOPT_HEADER => false, 
     CURLOPT_URL => 'https://api.twitter.com/1.1/search/tweets.json?q='.urlencode('"#'.$search.'"'), 
     CURLOPT_RETURNTRANSFER => true 
    ); 

    $feed = curl_init(); 
    curl_setopt_array($feed, $options); 
    $result = curl_exec($feed); 
    curl_close($feed); 

    $result3 = json_decode($result, true); 

    foreach($result3['statuses'] as $status){ 
     echo "<p>".$status['text']."</p>"; 
    } 
나는이 밖에 다른 사람에게 사용의 희망

아래

최종 작업 코드!

관련 문제