【问题标题】:Can't authenticate with OAUTH for Twitter API无法使用 OAUTH for Twitter API 进行身份验证
【发布时间】:2015-08-01 13:13:45
【问题描述】:

我正在尝试通过 Twitter 对使用 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 标头使用的值与我发送的相同。

【问题讨论】:

  • 尝试将 "CURLOPT_POST" =&gt; true 添加到您的 CURL 选项中
  • 这应该是一个 GET 请求。也测试过了,没用。

标签: php twitter drupal oauth


【解决方案1】:

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

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

和

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

使用与该文章完全相同的键和参数,然后验证您的标题看起来完全一样。

确保您没有切换键并且没有空格。

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

【讨论】:

    猜你喜欢
    • 2017-07-11
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 2021-04-14
    • 2020-12-11
    • 2017-10-12
    相关资源
    最近更新 更多