【问题标题】:twitter oAuth cURL Example not working - why? [duplicate]twitter oAuth cURL 示例不起作用 - 为什么? [复制]
【发布时间】:2011-03-18 15:02:14
【问题描述】:

可能重复:
another twitter oAuth cURL access token request that fails

下面的代码只是给了我:

验证 oauth 签名和令牌失败

        // Set url
        $url = "http://api.twitter.com/oauth/request_token";

        // Params to pass to twitter and create signature
        $params['oauth_callback'] = "http://localhost/twitter/tweet/";
        $params['oauth_consumer_key'] = $this->consumerKey;
        $params['oauth_nonce'] = SHA1(time());
        $params['oauth_timestamp'] = time();
        $params['oauth_signature_method'] = $this->signatureMethod;
        $params['oauth_version'] = $this->version;
        ksort($params);

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

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


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

        print $exec;

以下是 curls $info 打印出来的信息 ...

Array
(
    [url] => http://api.twitter.com/oauth/request_token
    [content_type] => text/html; charset=utf-8
    [http_code] => 401
    [header_size] => 919
    [request_size] => 181
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 1.176
    [namelookup_time] => 0
    [connect_time] => 0.127
    [pretransfer_time] => 0.127
    [size_upload] => 934
    [size_download] => 44
    [speed_download] => 37
    [speed_upload] => 794
    [download_content_length] => 44
    [upload_content_length] => 934
    [starttransfer_time] => 0.127
    [redirect_time] => 0
    [request_header] => POST /oauth/request_token HTTP/1.1
Host: api.twitter.com
Accept: */*
Content-Length: 934
Content-Type: multipart/form-data; boundary=----------------------------7465678a46cc
)

【问题讨论】:

    标签: curl twitter oauth


    【解决方案1】:

    您可能想准确说明它是如何不工作的,事情可能以多种不同的方式“不工作”。你得到错误结果吗?它们是什么,来自哪些电话?是否有任何特定步骤失败?

    首先,您不能使用“localhost”地址作为回调 URL,如果 twitter 服务器连接到“localhost”,它只会连接到自己,而不是连接到您。

    同样,您构建 $concatenatedParams 的方式使您的 $signatureBaseString 仅部分 URL 编码。而不是使用"{$k}%3D{$v}%26",通常使用=&,然后在将$concatenatedParams添加到$signatureBaseString时,最后完成urlencode

    【讨论】:

    • $concatenatedParams .= "{$k}%3D{$v}%26";应该完成 url 编码,但我试了一下,它仍然失败。
    • 我已经根据你的建议更新了代码 -> 但不是运气嘿。
    • 经过base64编码后,hash_hmac在分配给oauth_signature参数之前也必须进行url编码,我不知道base64_encode内部是否发生这种情况。
    • 并非如此,但已更新为这样做。不走运,同样的错误。
    • 您可能想尝试使用 GET 并将 oauth 参数作为 Authorization: 标头发送,如 Twitter 网站上的建议:dev.twitter.com/pages/auth#at-twitter
    猜你喜欢
    • 2015-11-08
    • 2019-10-20
    • 2018-11-14
    • 2014-09-05
    • 2016-02-18
    • 1970-01-01
    • 2014-01-26
    • 2011-06-06
    • 2020-02-18
    相关资源
    最近更新 更多