【问题标题】:Twitter API - saving OAuth token in sessionTwitter API - 在会话中保存 OAuth 令牌
【发布时间】:2011-12-12 20:19:59
【问题描述】:

我正在尝试找到一种方法来在使用 OAuth 获得授权后与 Twitter API 保持连接,但我遇到了问题。

我在尝试使用会话或数据库中保存的 Oauth 令牌连接到 Twitter API 时收到 "Invalid / expired Token"

有没有办法做到这一点?我不希望我的应用程序的用户每次都必须通过 Twitter 登录。当然,一旦他们授权了我的应用程序一次,就足够了?

$consumer_key = 'consumerkey';
$consumer_secret = 'consumersecret';

$twitterObj = new EpiTwitter($consumer_key, $consumer_secret);

if (isset($_GET['oauth_token'])){
    $oauth_token = $_GET['oauth_token'];
} else if ($_SESSION['oauth_token']){
    $oauth_token = $_SESSION['oauth_token'];

    echo $_SESSION['oauth_token'];
} else {
    //see if authorisation already set up in DB
    $query = mysql_query("SELECT oauth_token FROM PingSocialMediaUsers WHERE oauth_provider = 'twitter' AND clientID = '$clientID'");  
    $result = mysql_fetch_row($query); 
    $oauth_token = $result[0];
}

if($oauth_token == ''){ 
    $url = $twitterObj->getAuthorizationUrl();
    $twitter_login = $url;
 } else {
    $twitterObj->setToken($oauth_token);
    $token = $twitterObj->getAccessToken();
    $twitterObj->setToken($token->oauth_token, $token->oauth_token_secret);     
    $_SESSION['oauth_token'] = $token->oauth_token;
    $_SESSION['oauth_secret'] = $token->oauth_token_secret;
    $twitterInfo= $twitterObj->get_accountVerify_credentials();
    $twitterInfo->response;

    echo $twitterInfo->response['error'];
    //echo '<pre>';
    //print_r($twitterInfo);
    $id = $twitterInfo->id;
    $username = $twitterInfo->screen_name;

    //add to details database
    //find the user by ID  
    if ($id != ''){
        $query = mysql_query("SELECT * FROM PingSocialMediaUsers WHERE oauth_provider = 'twitter' AND oauth_uid = '$id'");  
        $result = mysql_fetch_array($query);  

        // If does not exist add to database  
        if(empty($result)){  
            $query = mysql_query("INSERT INTO PingSocialMediaUsers (oauth_provider, oauth_uid, username, oauth_token, oauth_secret) VALUES ('twitter', {$id}, '{$username}', '{$_SESSION['oauth_token']}', '{$_SESSION['oauth_secret']}')"); 
            $query = mysql_query("SELECT * FROM PingSocialMediaUsers WHERE id = " . mysql_insert_id());  
            $result = mysql_fetch_array($query);  
        } else {  
            //update the tokens  
            $query = mysql_query("UPDATE PingSocialMediaUsers SET oauth_token = '{$_SESSION['oauth_token']}', oauth_secret = '{$_SESSION['oauth_secret']}' WHERE oauth_provider = 'twitter' AND oauth_uid = {$id}");  
        }   

        $_SESSION['id'] = $result['id']; 
        $_SESSION['username'] = $result['username']; 
        $_SESSION['oauth_uid'] = $result['oauth_uid']; 
        $_SESSION['oauth_provider'] = $result['oauth_provider']; 
        $_SESSION['oauth_token'] = $result['oauth_token']; 
        $_SESSION['oauth_secret'] = $result['oauth_secret'];    
    }

    $twitterAuth = TRUE;    
} 

【问题讨论】:

  • 您的访问令牌应该是有效的,直到最终用户自己撤销。你如何储存它们?确定它们与从 twitter 收到的相同,确定你有正确的令牌秘密吗?
  • 我尝试将它存储在会话和数据库中,但无论哪种方式,我都会收到错误消息。它唯一有效的时候是当我使用 Twitter 自动上升,因此使用 $_GET 方法从回调 URL 获取自动密钥。我已经展示了上面的代码。

标签: session oauth twitter


【解决方案1】:

我相信您在谈论 access_token,您将从 twitter 获得,作为 OAuth 握手的最后一部分,之后您可以代表用户访问那里的服务。

这是他们在官方开发者页面上所说的话

We do not currently expire access tokens. 
Your access token will be invalid if a user explicitly 
rejects your application from their settings or if a Twitter admin suspends 
your application. If your application is suspended there will be
a note on your application page saying that it has been suspended.

因此,您可以很好地将该令牌存储在您的数据库中,并随时可以在以后使用。

这里是 API 页面的参考 Twitter OAuth FAQ

所以我建议您确保您没有更改任何应用程序设置并且您从会话/数据库中获得了有效的 access_token

【讨论】:

  • 我已经意识到它不允许我在没有令牌密码的情况下连接访问令牌。因此,我还需要将 oauth_token_secret 保存在数据库中。感谢您的帮助。
  • @LeeTee 我没有与 Twitter 集成,但与 google 集成,是的,你必须传递相同的 secret_token 否则总是会受到 google 的攻击 :)
猜你喜欢
  • 2012-01-18
  • 1970-01-01
  • 2021-12-08
  • 2012-10-21
  • 2018-02-05
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多