使用Twitter OAuth API进行身份验证

3

我目前正在尝试用OAuth将Twitter集成到我正在开发的PHP Web应用程序中。

我有一个HTML页面,提供了一个链接到Twitter应用程序认证URL,它似乎工作正常,并显示认证屏幕。

以下是调用函数的代码。

if (!isset($_GET['oauth_token']))
{
    //include("phpHandler/twitterLib/secret.php");
    getTwitterURL($consumer_key, $consumer_secret);
}

consumer_key和consumer_secret被包含在一个php文件中。

以下是获取Twitter授权URL的代码。

function getTwitterUrl($consumer_key, $consumer_secret)
{
    $twitterObj = new EpiTwitter($consumer_key, $consumer_secret);
    $url = $twitterObj->getAuthorizationUrl();
    echo '<a class="linkButtons" href="'.$url.'">Add Twitter</a>';
}

这将重定向回页面,然后我调用身份验证方法来检索信息,例如 Twitter 用户名。以下是执行身份验证的功能:

function authenticate($consumer_key, $consumer_secret)
{
    require ("twitterLib/EpiCurl.php");
    require ("twitterLib/EpiOAuth.php");
    require ("twitterLib/EpiTwitter.php");
    require ("twitterLib/secret.php");*/
    $twitterObj = new EpiTwitter($consumer_key, $consumer_secret);
    $twitterObj->setToken($_GET['oauth_token']);
    $token = $twitterObj->getAccessToken();
    $twitterObj = new EpiTwitter($consumer_key, $consumer_secret);
    $twitterObj->setToken($token->oauth_token, $token->oauth_token_secret);
    $token = $twitterObj->getAccessToken();
    $twitterObj->setToken($token->oauth_token, $token->oauth_token_secret);
    $_SESSION['ot'] = $token->oauth_token;
    $_SESSION['ots'] = $token->oauth_token_secret;
    $twitterInfo= $twitterObj->get_accountVerify_credentials();
    echo '<pre>';
    print_r($twitterInfo->response);
  }

echo和print_r用于展示从Twitter返回的响应信息。

我在数组中得到了以下错误输出:

Array ( [error] => 无效/过期令牌 [request] => /account/verify_credentials.json )

我该如何解决这个错误呢?我不知道为什么会无效或者过期,我已经关闭了浏览器并重新打开,但是还是出现了同样的错误。

感谢您能提供的任何帮助。


1
请仔细检查您的 $comsumer_key$consumer_secret - Erik
我已经检查过了,它们似乎没问题。 - Boardy
为什么 //include("phpHandler/twitterLib/secret.php"); 被注释掉了?难道不是从那里获取 $consumer_key$consumer_secret 的地方吗? - Erik
我本意是完全将其从代码中删除的,现在它被包含在if语句之外。 - Boardy
3个回答

1

如果用户明确拒绝您的应用程序或Twitter管理员暂停您的应用程序,则您的访问令牌将无效。如果您的应用程序被暂停,您的应用程序页面上会有一个注释说明它已被暂停。

许多用户信任应用程序读取其信息,但不一定更改其名称或发布新状态。通过Twitter API更新信息(例如名称、位置或添加新状态)需要HTTP POST。我们在实现时遵循了相同的限制。任何需要HTTP POST的API方法都被视为写入方法,并需要读取和写入访问权限。

无论您的存储系统是什么,您都需要开始为您的应用程序每个用户存储oauth_token和oauth_token_secret(统称为“访问令牌”)。 oauth_token_secret应该安全地存储。请记住,您将为应用程序对Twitter API进行的每个经过身份验证的请求访问这些值,因此以可扩展到您的用户群体的方式存储它们。使用OAuth时,您不应再为任何用户存储密码。

require '../tmhOAuth.php';

require '../tmhUtilities.php';

$tmhOAuth = new tmhOAuth(array(

  'consumer_key'    => 'YOUR_CONSUMER_KEY',

  'consumer_secret' => 'YOUR_CONSUMER_SECRET',

  'user_token'      => 'AN_ACCESS_TOKEN',

  'user_secret'     => 'AN_ACCESS_TOKEN_SECRET',

));



// we're using a hardcoded image path here. You can easily replace this with an uploaded image-see images.php example)

// 'image = "@{$_FILES['image']['tmp_name']};type={$_FILES['image']['type']};filename={$_FILES['image']['name']}",



$image = "./dickvandyke.jpg';



$code = $tmhOAuth->request('POST', 'https://upload.twitter.com/1/statuses/update_with_media.json',

  array(

    'media[]'  => "@{$image}",

    'status'   => "Don't slip up" // Don't give up..

  ),

  true, // use auth

  true  // multipart

);



if ($code == 200) {

  tmhUtilities::pr(json_decode($tmhOAuth->response['response']));

} else {

  tmhUtilities::pr($tmhOAuth->response['response']);

}

0

我曾经开发过新的Twitter API。我使用以下代码,它对我来说运行良好。

<?php
require "vendor/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;
$consumer_key = "XXXXXXX";
$consumer_secret = "XXXXXXX";

$connection = new TwitterOAuth($consumer_key, $consumer_secret);

 $request_token= $connection->oauth('oauth/request_token', array('oauth_callback' => "http://callbackurlhere.com/callback.php"));
$url = $connection->url("oauth/authorize", array("oauth_token" => $request_token['oauth_token']));

header('Location: '. $url);
?>

以下是callback.php代码,用于获取永久oauthToken并将其保存在数据库中以供进一步使用:

<?php
require "vendor/autoload.php";

use Abraham\TwitterOAuth\TwitterOAuth;

    // session_start();
    if(isset($_REQUEST['oauth_verifier'])){

    $oauth_access_token = $_REQUEST['oauth_token'];
    $oauth_access_token_secret = $_REQUEST['oauth_verifier'];
    $consumer_key = "XXXXXXXXXXXXXXXX";
    $consumer_secret = "XXXXXXXXXXXXXXX";
    $connection = new TwitterOAuth($consumer_key, $consumer_secret,$oauth_access_token , $oauth_access_token_secret );

    $access_token = $connection->oauth("oauth/access_token", array("oauth_verifier" => $oauth_access_token_secret));
    var_dump($access_token); die("--success here--");// Obtain tokens and save it in database for further use.
    }

    ?>

0

我已经找到了问题。我总是在authenticate函数中创建两个新的EpiTwitter对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接