无法通过OAUTH对Twitter API进行身份验证

时间:2015-07-30 15:40:43

标签: php twitter drupal oauth

我正在尝试使用Drupal对使用Drupal的自定义应用进行身份验证。

出于某种原因,即使我包含了我的OAuth凭据,我也无法通过Twitter API进行身份验证。

这是我的代码:

/**
 * Pulls Twitter data for processing.
 */
function sentiment_analyzer_twitter_pull() {

  $url = "https://api.twitter.com/1.1/search/tweets.json?q=%23superbowl&result_type=recent"; // test data used by Twitter

  $oauth_access_token = variable_get('sentiment_analyzer_twitter_token');
  $oauth_access_token_secret = variable_get('sentiment_analyzer_twitter_token_secret');
  $consumer_key = variable_get('sentiment_analyzer_twitter_consumer_key');
  $consumer_secret = variable_get('sentiment_analyzer_twitter_consumer_secret');

  $oauth = array('oauth_consumer_key' => $consumer_key,
    'oauth_nonce' => time(),
    'oauth_signature_method' => 'HMAC-SHA1',
    'oauth_token' => $oauth_access_token,
    'oauth_timestamp' => time(),
    'oauth_version' => '1.0');

  $base_info = sentiment_analyzer_build_base_string($url, 'GET', $oauth);
  $composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret);
  $oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
  $oauth['oauth_signature'] = $oauth_signature;

  // Make requests
  $header = array(sentiment_analyzer_build_authorization_header($oauth), 'Expect:');
  $options = array(CURLOPT_HTTPHEADER => $header,
    //CURLOPT_POSTFIELDS => $postfields,
    CURLOPT_HEADER => false,
    CURLOPT_URL => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_SSL_VERIFYPEER => false);

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

  $twitter_data = json_decode($json);

  watchdog("twitter data", "<pre>" . print_r($twitter_data, true) . "</pre>");

}

function sentiment_analyzer_build_base_string($base_uri, $method, $params) {
  $r = array();
  ksort($params);
  foreach ($params as $key => $value) {
    $r[] = "$key=" . rawurlencode($value);
  }
  return $method . "&" . rawurlencode($base_uri) . '&' . rawurlencode(implode('&', $r));
}

function sentiment_analyzer_build_authorization_header($oauth) {
  $r = 'Authorization: OAuth ';
  $values = array();
  foreach ($oauth as $key => $value)
    $values[] = "$key=\"" . rawurlencode($value) . "\"";
  $r .= implode(', ', $values);
  return $r;
}

我得到的回应是:

stdClass Object
(
    [errors] => Array
        (
            [0] => stdClass Object
                (
                    [code] => 32
                    [message] => Could not authenticate you.
                )

        )

)

尽管我能够使用此控制台:

https://dev.twitter.com/rest/tools/console

执行查询。

我做错了什么?

Twitter似乎使用的OAuth的HTTP标头使用与我发送的相同的值。

1 个答案:

答案 0 :(得分:0)

看不出任何明显错误,但我在构建我的时候使用了以下内容(不同的语言):

https://dev.twitter.com/oauth/overview/authorizing-requests

https://dev.twitter.com/oauth/overview/creating-signatures

使用该文章中的确切键和参数,然后验证标题看起来完全相同。

确保没有切换钥匙且没有空格。

另一个常见问题是服务器时钟差异。从Twitter的响应标题查看时间,确保您的时间相同。