【问题标题】:Twitter API returns "Could not authenticate you" error if parameters are present in URL如果 URL 中存在参数,Twitter API 将返回“无法对您进行身份验证”错误
【发布时间】:2015-04-01 10:29:47
【问题描述】:

我正在尝试通过 OAuth 1.0a 加载 Twitter users friend 列表。 如果 URL 没有任何参数,它就可以工作,例如:

作品:https://api.twitter.com/1.1/friends/list.json

不起作用:https://api.twitter.com/1.1/friends/list.json?cursor=-1&skip_status=true&include_user_entities=false

如果我向它添加参数,我会返回此错误:

无法验证您的身份

这可能是什么原因? 我的代码:

<?php
$oauthToken = 'removed'; 
$oauthTokenSecret = 'removed'; 

function buildBaseString($baseURI, $method, $params)
{
    $r = array(); 
    ksort($params); 
    foreach($params as $key=>$value){
        $r[] = "$key=" . rawurlencode($value); 
    }            

    return $method."&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r));
}

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

    $r .= implode(', ', $values); 
    return $r; 
}

//WORKS:
$url = 'https://api.twitter.com/1.1/friends/list.json';

//DOESN'T WORK, WHY?:
//$url = 'https://api.twitter.com/1.1/friends/list.json?cursor=-1&skip_status=true&include_user_entities=false';

$consumer_key = 'removed';
$consumer_secret = 'removed';

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

$base_info = buildBaseString($url, 'GET', $oauth);

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


$header = array(buildAuthorizationHeader($oauth), 'Expect:');
$options = array( CURLOPT_HTTPHEADER => $header,
                  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);

echo "JSON: ".$json;

curl_close($feed);
?>

【问题讨论】:

标签: php json api url twitter


【解决方案1】:

您需要在 OAuth 标头中包含参数。最好的方法是将它们从 URL 中分离出来。

$params = array(
    "cursor" => -1,
    "skip_status" => "true",
    "include_user_entities" => "false"
);

现在使用基本 url 构建基本字符串。

$url = 'https://api.twitter.com/1.1/friends/list.json'
$oAuthHeaders = $oauth + $params;
$base_info = buildBaseString($url, 'GET', $oAuthHeaders);
$composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauthTokenSecret);
$oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
$oAuthHeaders['oauth_signature'] = $oauth_signature;

最后,创建带有附加参数的 URLString:

if ($params) {
   $finalURL = "$url?";
   foreach ($params as $key=>$param) {
       $finalURL .= rawurlencode($key) . "=" . rawurlencode($param) . "&";
   }
   $finalURL = substr($finalURL, 0, strlen($finalURL) - 1);
}

现在您可以发送整个包裹了:

$header = array(buildAuthorizationHeader($oAuthHeaders), 'Expect:');

【讨论】:

    【解决方案2】:

    url 也有参数,所以你应该尝试遵循这个(在你的函数 buildBaseString 中):

    1. 将 HTTP 方法转换为大写,并将输出字符串设置为该值。
    2. 将“&”字符附加到输出字符串。
    3. 百分比编码 URL 并将其附加到输出字符串。
    4. 将“&”字符附加到输出字符串。
    5. 百分比编码参数字符串并将其附加到输出 字符串。

    (摘自:creating signatures)

    现在你有了类似这样的编码基 url:

    GET&https%3A%2F%2Fapi.twitter.com%2F1.1%2Ffriends%2Flist.json%3Fcursor%3D-1%26skip_status%3Dtrue%26include_user_entities%3Dfalse&oauth_consumer_key%3Dremoved%26oauth_nonce%3D1423633315%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1423633315%26oauth_token%3Dremoved%26oauth_version%3D1.0
    

    也许你必须尝试得到这个:

    GET&https%3A%2F%2Fapi.twitter.com%2F1.1%2Ffriends%2Flist.json&cursor%3D-1%26skip_status%3Dtrue%26include_user_entities%3Dfalse%26oauth_consumer_key%3Dremoved%26oauth_nonce%3D1423633315%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1423633315%26oauth_token%3Dremoved%26oauth_version%3D1.0
    

    【讨论】:

      【解决方案3】:

      您似乎在 = 符号上使用了 rawurlencode。这会将其转换为%3D。

      所以当你想要cursor=-1 时,你会得到cursor%3D-1。

      或许可以尝试简化函数,以便不对= 进行编码?

      【讨论】:

        【解决方案4】:

        这是获取用户信息的示例代码

               require_once('oauth/twitteroauth.php'); 
        
        $oauth_token='YOUR OAUTH TOKEN';
        $oauth_token_secret='YOUR SECRET KEY';
        function getConnectionWithAccessToken($oauth_token, $oauth_token_secret) {
          $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $oauth_token, $oauth_token_secret);
          return $connection;
        }
        
        $connection = getConnectionWithAccessToken($oauth_token, $oauth_token_secret);
        
        $content = $connection->get('account/verify_credentials');
        

        【讨论】:

          猜你喜欢
          • 2022-01-01
          • 2011-08-04
          • 2013-02-15
          • 2021-04-14
          • 2023-03-15
          • 2017-07-11
          • 2014-05-01
          • 2014-06-17
          • 1970-01-01
          相关资源
          最近更新 更多