【问题标题】:Twitter API - Failed to validate oauth signature and token PHP / CURLTwitter API - 无法验证 oauth 签名和令牌 PHP / CURL
【发布时间】:2011-07-24 03:09:12
【问题描述】:

我在过去的几个小时里尝试了所有类型的变体,但根据 Twitter API,这应该从第 1 步开始工作!

我在下面的脚本中添加了以下内容: $header = array("期望:");

我发现这有助于在另一个关于 stackoverflow 的问题中获得被拒绝的问题/100-继续。

问题: 验证 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);

有人能看出我在这里可能犯的明显错误吗?最好我不想使用其他人的代码,因为大多数示例都有完整的类和大量函数,我正在寻找最简单的方法!

【问题讨论】:

    标签: php curl


    【解决方案1】:

    您的问题是您的请求中没有包含 OAuth 签名。
    您可以在 this page 上阅读有关此概念的信息。
    可以在here 找到一个有效的实现。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,我缺少的是将标头传递给 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));
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-28
        • 2011-04-08
        • 2014-04-02
        相关资源
        最近更新 更多