1

我在网上找到了一个图书馆来开始使用 Twitter OAuth,它让我建立了联系,并且能够从 Twitter 中提取一些数据。我将令牌保存到会话中(我将把它们放入数据库进行生产,但我现在只是想了解基础知识)。当我切换到不同的页面并且不再能够进行 API 调用时,问题就出现了。

这是我的代码:

(如果我的括号在这里不完全匹配,那是因为我去掉了推特部分来显示)

session_start();
if(strtolower($_GET['via']) == 'twitter'){
    //login to twitter
    $from = strip_tags($_GET['from']);
    $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
     /* Get temporary credentials. */
    $request_token = $connection->getRequestToken($from);
    /* Save temporary credentials to session. */
    $_SESSION['oauth_token'] = $token = $request_token['oauth_token'];
    $_SESSION['oauth_token_secret'] = $request_token['oauth_token_secret'];
    switch ($connection->http_code) {
      case 200:
        /* Build authorize URL and redirect user to Twitter. */
        $url = $connection->getAuthorizeURL($token);
        header('Location: ' . $url);
        break;
      default:
        /* Show notification if something went wrong. */
        echo 'Could not connect to Twitter. Refresh the page or try again later.';
        }
    }elseif(!empty($_GET['oauth_verifier']) && !empty($_SESSION['oauth_token']) && !empty($_SESSION['oauth_token_secret'])){
/* If last connection failed don't display authorization link. */
$_SESSION['oauth_verifier'] = $_GET['oauth_verifier'];
$twitteroauth = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);
// Let's request the access token
$access_token = $twitteroauth->getAccessToken($_SESSION['oauth_verifier']);
// Save it in a session var
$_SESSION['access_token'] = $access_token;
// Let's get the user's info
$user_info = $twitteroauth->get('account/verify_credentials');
$home_timeline = $twitteroauth->get('statuses/home_timeline', array('count' => 3));
// Print user's info
echo "<pre>";
print_r($user_info);
echo "</pre>";
echo "<pre>";
print_r($home_timeline);
echo "</pre>";
}

因此,在保存到变量并进行身份验证后,我就可以按预期查询 API。在我切换到与块中的代码基本相同的不同页面后,elseif()当我尝试提取数据时,我简单地收到以下错误消息:

stdClass Object
(
[request] => /1/account/verify_credentials.json?oauth_consumer_key=djtrixYaxkM4QFzhtfTg&oauth_nonce=8d27112c1ee645b4253c8f803cf428d4&oauth_signature=N6Ug5w%2BNqzo%2FY%2By7UuO0jDqWUdA%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1297720180&oauth_token=&oauth_version=1.0
[error] => Could not authenticate you.
)

关于如何让此身份验证在整个会话中“坚持”的任何见解?

编辑 如下所述,在 URL 中 oauth_token 没有任何价值。所以我做了一个print_r($_SESSION),我看到$_SESSION['oauth_token']它确实有价值。

Array ( 
[oauth_token] => 12345
[oauth_token_secret] => 67890
[oauth_verifier] => [access_token] => Array (
    [ "1.0" encoding="UTF-8"?> /oauth/access_token?oauth_consumer_key=111111
    [amp;oauth_nonce] => 222222
    [amp;oauth_signature] => 777777= 
    [amp;oauth_signature_method] => HMAC-SHA1 
    [amp;oauth_timestamp] => 1297783851 
    [amp;oauth_token] => 12345
    [amp;oauth_version] => 1.0 Invalid / expired Token 
    )
)

这个数组看起来可能格式不正确,但我会坦率地承认我不知道它应该是什么样子。而且,由于我没有对库进行任何更改——只是演示代码——我不确定这是怎么发生的。

4

2 回答 2

3

注意oauth_token没有价值。在您的其他页面上,您可能没有启动会话,或者您没有正确地将访问令牌拉出会话。

于 2011-02-15T01:38:15.893 回答
0

尝试将 OAuth oauth_timestamp 增加几个小时。

在 PHP OAuth 客户端中,它看起来像这样:

private static function generate_timestamp() {
    return time()+5*3600;
}

资源

http://www.backwardcompatible.net/149-Twitter-Timestamp-out-of-bounds-solved

于 2015-03-10T15:56:02.250 回答