twitter api对request_token没有回复

时间:2013-07-11 20:12:46

标签: php curl twitter-oauth

我一直在尝试按照Twitter登录文档中的步骤进行操作:https://dev.twitter.com/docs/auth/implementing-sign-twitter

我的代码:

$oauth_consumer_secret = '***';
$access_token_secret = '***';

$oauth_consumer_key = '***';
$oauth_nonce = createNonce();
$oauth_signature_method = 'HMAC-SHA1';
$oauth_time = time();
$oauth_token = '***';
$oauth_version = '1.0';

$oauth = array(
    'oauth_callback' => '***',
    'oauth_consumer_key'=>$oauth_consumer_key,
    'oauth_nonce'=>$oauth_nonce,
    'oauth_signature_method'=>$oauth_signature_method,
    'oauth_timestamp'=>$oauth_time,
    'oauth_token'=>$oauth_token,
    'oauth_version'=>$oauth_version
);

$baseURI = 'https://api.twitter.com/1.1/oauth/request_token';
$baseString = buildBaseString($baseURI,$oauth);
$compositeKey = getCompositeKey($oauth_consumer_secret,null);
$oauth_signature = base64_encode(hash_hmac('sha1', $baseString, $compositeKey, true));
$oauth['oauth_signature'] = $oauth_signature; //add the signature to our oauth array

$header = array(buildAuthorizationHeader($oauth));
$login = loginUser($baseURI,$header);
echo $login;

function loginUser($baseURI,$header){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $baseURI);
    curl_setopt($ch, CURLOPT_HEADER, TRUE);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
    $output = curl_exec($ch);
    curl_close($ch);
    if ($output!=''){
        return $output;
    } else {
        return 'fail';
    };
};

function buildBaseString($baseURI,$params){
    $r = array(); // temp array
    ksort($params); // sorts params alphabetically by key
    foreach($params as $key=>$value){
        $r[] = '$key='.rawurlencode($value);
    };
    return 'POST&'.rawurlencode($baseURI).'&'.rawurlencode(implode('&', $r)); // returns complete base string
};

// Create composite key
function getCompositeKey($consumerSecret,$requestToken){
    return rawurlencode($consumerSecret) . '&' . rawurlencode($requestToken);
};

function createNonce(){
    $characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
    $string = '';
    for ($i=0; $i<32; $i++) {
            $string .= $characters[rand(0, strlen($characters) - 1)];
    };
    return $string;
};

function buildAuthorizationHeader($oauth){
    $r = 'Authorization: OAuth '; //header prefix
    $values = array(); //temporary key=value array
    foreach($oauth as $key=>$value)
    $values[] = "$key=\"" . rawurlencode($value) . "\""; //encode key=value string
    $r .= implode(', ', $values); //reassemble
    return $r; //return full authorization header
};

我遇到的问题是我没有得到任何回应!所以登录功能只是继续“失败”。

当我将curlopt_ssl_verifypeer更改为false时,我收到HTTP / 1.1 401 Unauthorized错误。

任何帮助或线索都将不胜感激。

1 个答案:

答案 0 :(得分:1)

SSL和OAuth问题很可能是分开的。

对于SSL,您的证书授权(CA)捆绑包很可能已过期。您可以告诉curl不验证对等CURLOPT_SSL_VERIFYPEER = 0或更新CA包。您可以下载current CA bundle here。大多数人(包括我自己)只关闭了VERIFYPEER。虽然不鼓励这种做法,但这是一种常见的解决方案。

生成请求令牌时,oauth参数中不需要oauth_token。您要求提供请求令牌,但还没有请求令牌。不确定这是否重要,但仅使用','作为分隔符,而不是', '中的$r .= implode(', ', $values); //reassemble

我查看了其余的实现,看起来是正确的。写完自己的,我可以在这里体会到这里的困难。